# ๐ŸงŠ drop-queue **`drop-queue`** is a simple, composable async drop queue for Rust โ€” built to run queued tasks in FIFO order and ensure graceful shutdown via draining. It's useful in lifecycle-managed environments (e.g., `notmad`) or as a lightweight alternative until async drop is stabilized in Rust. > ๐Ÿ’ก Tasks are executed one at a time. If the queue is marked for draining, no further items can be added. --- ## โœจ Features * Assign one-off async tasks (closures) to a queue * FIFO task processing * Draining mechanism to flush the queue before shutdown * Optional integration with [`notmad`](https://crates.io/crates/notmad) for graceful component lifecycle control * `Send + Sync + 'static` guaranteed --- ## ๐Ÿš€ Usage ### Add to `Cargo.toml` ```toml [dependencies] drop-queue = "*" ``` ### Enable `notmad` integration (optional) ```toml [dependencies] drop-queue = { version = "*", features = ["notmad"] } ``` --- ## ๐Ÿ›  Example ```rust use drop-queue::DropQueue; use tokio::sync::oneshot; #[tokio::main] async fn main() -> anyhow::Result<()> { let queue = DropQueue::new(); let (tx, rx) = oneshot::channel(); queue.assign(|| async move { println!("Running closure task"); tx.send(()).unwrap(); Ok(()) })?; queue.process_next().await?; rx.await?; Ok(()) } ``` --- ## ๐Ÿ” Lifecycle with `notmad` If using the [`notmad`](https://crates.io/crates/notmad) lifecycle framework: ```rust #[tokio::main] async fn main() -> anyhow::Result<()> { let queue = drop-queue::DropQueue::new(); let app = notmad::Mad::new().add(queue); app.run().await?; Ok(()) } ``` This will process tasks until the cancellation token is triggered, e.g., via SIGINT. --- ## ๐Ÿ”’ Drain Mode You can signal the queue to stop accepting new items and finish processing the current ones: ```rust queue.drain().await?; ``` After this call, any further `assign()` will panic. --- ## ๐Ÿงช Tests Run the test suite using: ```bash cargo test ``` --- ## ๐Ÿ“œ License MIT