1use async_trait::async_trait;
2
3use crate::error::Result;
4
5use super::{FlowTask, FlowTaskLease};
6
7#[async_trait]
9pub trait FlowTaskQueue: Send + Sync {
10 async fn enqueue(&self, task: FlowTask) -> Result<()>;
11
12 async fn lease(&self) -> Result<Option<FlowTaskLease>>;
13
14 async fn ack(&self, lease_id: &str) -> Result<()>;
15
16 async fn requeue_inflight(&self) -> Result<usize> {
17 Ok(0)
18 }
19
20 async fn dequeue(&self) -> Result<Option<FlowTask>> {
21 let Some(lease) = self.lease().await? else {
22 return Ok(None);
23 };
24 let task = lease.task.clone();
25 self.ack(&lease.lease_id).await?;
26 Ok(Some(task))
27 }
28
29 async fn len(&self) -> Result<usize>;
30
31 async fn is_empty(&self) -> Result<bool> {
32 Ok(self.len().await? == 0)
33 }
34}