// feature: worker
Background Task Queue
A Celery-inspired Redis-backed asynchronous queue system with zero-config discovery.
Defining Tasks
#[floz::task(queue = "default", max_retries = 3)]
async fn send_email(to: String, subject: String) -> Result<(), floz::FlozError> {
// Do background work...
Ok(())
}
Dispatching Tasks
// Dispatch immediately
send_email::dispatch("user@example.com".into(), "Welcome".into())
.enqueue()?;
// Schedule with delay
send_email::dispatch("admin@site.com".into(), "Daily Report".into())
.delay(chrono::Duration::hours(24))
.enqueue()?;
Worker Runtime
// Start 4 concurrent worker threads alongside the web server
floz::App::new()
.with_worker(4)
.run(|cfg| {
app::configure(cfg);
})
.await
Note: Requires the worker feature flag and a valid REDIS_URL configured in your environment.
// feature: auth
Auth Module
JWT token management and API key generation. Feature-gated — zero overhead if not used.
JWT
let (token, expiry) = jwt::create_token(
"user-123", "admin", b"secret",
"my-app", "floz", 24, // hours
)?;
let claims = jwt::verify_token(&token, b"secret", "my-app", "floz")?;
// claims.sub → "user-123", claims.role → "admin"
API Keys
let key = api_key::generate_api_key("sk");
// → "sk_V1StGXR8_Z5jdHi6B-myT"
let hash = api_key::hash_api_key(&key)?; // bcrypt
let valid = api_key::verify_api_key_hash(&key, &hash)?;
// feature: logger
Logging
Daily-rotating log files with stdout mirroring. Auto-initialized by App::run().
// Auto-initialized when logger feature is enabled
floz::logger::init_tracing();
// Output: logs/my-app.log.2026-04-03
// Daily rotation, non-blocking writes
// Override filter via RUST_LOG env var
// macros
Utility Macros
| Macro | Description | Example |
|---|---|---|
res!(body) | JSON response (200 or custom status) | res!(body, 201) |
pp!(&data) | Pretty-print in DEV, compact in PROD | pp!(&users).unwrap() |
echo!(...) | Debug log only when ECHO is set | echo!("user {}", id) |
xquery!(sql, ...) | SQLx query with auto-bind | xquery!("SELECT...", id) |
to_json!(row) | Convert sqlx::Row to JSON map | to_json!(row) |
// controller
Controller Utilities
JsonResponse
JsonResponse::ok(&users) // 200 (pretty in DEV)
JsonResponse::created(&user) // 201
JsonResponse::no_content() // 204
JsonResponse::bad_request("Invalid") // 400
JsonResponse::not_found("Not found") // 404
PaginationParams
// Auto-extracted from query string
// /users?limit=20&offset=0&order_by=name&search=alice
#[ntex::web::get("/users")]
async fn list(params: web::types::Query<PaginationParams>) -> HttpResponse {
let p = params.into_inner();
// p.limit, p.offset, p.order_by, p.filter, p.search
}
// tooling
CLI Tool
The floz-cli scaffolds projects and generates domain modules.
$ floz new my-app --template api
$ floz generate model Post title:string body:text
$ floz generate scaffold Post title:string body:text
# Generates: src/app/post/{mod,model,route}.rs
Project Templates
| Template | Features | Use Case |
|---|---|---|
minimal | Single-file server + health | Microservices |
api | Modular src/app/ structure | REST APIs |
saas | Full: auth + workers + Redis | SaaS apps |