mod common;
use std::time::Duration;
use common::RunningWorker;
use serde::{Deserialize, Serialize};
use steda::{Result, Task, TaskContext};
#[derive(Debug, Deserialize, Serialize)]
struct RenderInvoiceInput {
invoice_number: String,
subtotal_cents: u64,
tax_cents: u64,
}
#[derive(Debug, Deserialize, Serialize)]
struct RenderInvoiceOutput {
invoice_number: String,
total_cents: u64,
}
const RENDER_INVOICE: Task<RenderInvoiceInput, RenderInvoiceOutput> = Task::new("render-invoice");
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<()> {
let steda = common::connect().await?;
let queue = steda.queue("example-basic")?;
queue.create().await?;
let worker = queue
.worker()
.task(RENDER_INVOICE, async |input: RenderInvoiceInput, _ctx: TaskContext| {
Ok(RenderInvoiceOutput {
invoice_number: input.invoice_number,
total_cents: input.subtotal_cents + input.tax_cents,
})
})
.build()?;
let worker = RunningWorker::start(worker);
let task = queue
.spawn(
RENDER_INVOICE,
RenderInvoiceInput {
invoice_number: "INV-1001".to_owned(),
subtotal_cents: 12_500,
tax_cents: 2_625,
},
)
.await?;
let invoice = task.result_with_timeout(Duration::from_secs(10)).await?;
println!("invoice {} rendered", invoice.invoice_number);
println!("total: €{}.{:02}", invoice.total_cents / 100, invoice.total_cents % 100);
worker.stop().await?;
Ok(())
}