reifydb_sub_task/
handle.rs1use tokio::sync::mpsc;
5
6use crate::{
7 coordinator::CoordinatorMessage,
8 registry::{TaskInfo, TaskRegistry},
9 task::{ScheduledTask, TaskId},
10};
11
12#[derive(Clone)]
14pub struct TaskHandle {
15 registry: TaskRegistry,
16 coordinator_tx: mpsc::Sender<CoordinatorMessage>,
17}
18
19impl TaskHandle {
20 pub(crate) fn new(registry: TaskRegistry, coordinator_tx: mpsc::Sender<CoordinatorMessage>) -> Self {
21 Self {
22 registry,
23 coordinator_tx,
24 }
25 }
26
27 pub async fn register_task(&self, task: ScheduledTask) -> Result<TaskId, String> {
28 let task_id = task.id;
29
30 self.coordinator_tx
31 .send(CoordinatorMessage::Register(task))
32 .await
33 .map_err(|e| format!("Failed to register task: {}", e))?;
34
35 Ok(task_id)
36 }
37
38 pub async fn unregister_task(&self, task_id: TaskId) -> Result<(), String> {
39 self.coordinator_tx
40 .send(CoordinatorMessage::Unregister(task_id))
41 .await
42 .map_err(|e| format!("Failed to unregister task: {}", e))?;
43
44 Ok(())
45 }
46
47 pub fn list_tasks(&self) -> Vec<TaskInfo> {
48 self.registry.iter().map(|entry| TaskInfo::from_entry(*entry.key(), entry.value())).collect()
49 }
50
51 pub fn get_task_info(&self, task_id: TaskId) -> Option<TaskInfo> {
52 self.registry.get(&task_id).map(|entry| TaskInfo::from_entry(task_id, entry.value()))
53 }
54}