Skip to main content

a3s_flow/worker/
memory.rs

1use async_trait::async_trait;
2use std::collections::VecDeque;
3use tokio::sync::Mutex;
4use uuid::Uuid;
5
6use crate::error::Result;
7
8use super::{FlowTask, FlowTaskLease, FlowTaskQueue};
9
10/// In-process FIFO queue for tests, embedded hosts, and local workers.
11#[derive(Debug, Default)]
12pub struct InMemoryFlowTaskQueue {
13    tasks: Mutex<VecDeque<FlowTask>>,
14}
15
16impl InMemoryFlowTaskQueue {
17    pub fn new() -> Self {
18        Self::default()
19    }
20}
21
22#[async_trait]
23impl FlowTaskQueue for InMemoryFlowTaskQueue {
24    async fn enqueue(&self, task: FlowTask) -> Result<()> {
25        self.tasks.lock().await.push_back(task);
26        Ok(())
27    }
28
29    async fn lease(&self) -> Result<Option<FlowTaskLease>> {
30        Ok(self
31            .tasks
32            .lock()
33            .await
34            .pop_front()
35            .map(|task| FlowTaskLease {
36                lease_id: Uuid::new_v4().to_string(),
37                task,
38            }))
39    }
40
41    async fn ack(&self, _lease_id: &str) -> Result<()> {
42        Ok(())
43    }
44
45    async fn len(&self) -> Result<usize> {
46        Ok(self.tasks.lock().await.len())
47    }
48}