Skip to main content

reifydb_sub_task/
handle.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright (c) 2026 ReifyDB
3
4use reifydb_core::interface::catalog::task::TaskId;
5use tokio::sync::mpsc;
6
7use crate::{
8	coordinator::TaskCoordinatorMessage,
9	registry::{TaskInfo, TaskRegistry},
10	task::ScheduledTask,
11};
12
13#[derive(Clone)]
14pub struct TaskHandle {
15	registry: TaskRegistry,
16	coordinator_tx: mpsc::Sender<TaskCoordinatorMessage>,
17}
18
19impl TaskHandle {
20	pub(crate) fn new(registry: TaskRegistry, coordinator_tx: mpsc::Sender<TaskCoordinatorMessage>) -> 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(TaskCoordinatorMessage::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(TaskCoordinatorMessage::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}