1#![warn(clippy::pedantic, missing_docs)]
4#![allow(clippy::module_name_repetitions, clippy::ignored_unit_patterns)]
5
6use async_trait::async_trait;
7use ora_common::task::{TaskDataFormat, TaskDefinition, WorkerSelector};
8use registry::SupportedTask;
9use tokio_util::sync::CancellationToken;
10use uuid::Uuid;
11
12pub mod store;
13pub mod worker;
14
15#[cfg(feature = "registry")]
16pub mod registry;
17
18#[derive(Debug, Clone)]
20pub struct TaskContext {
21 task_id: Uuid,
22 cancellation: CancellationToken,
23}
24
25impl TaskContext {
26 #[must_use]
28 #[inline]
29 pub const fn task_id(&self) -> Uuid {
30 self.task_id
31 }
32
33 #[must_use]
35 pub fn is_cancelled(&self) -> bool {
36 self.cancellation.is_cancelled()
37 }
38
39 pub async fn cancelled(&self) {
41 self.cancellation.cancelled().await;
42 }
43}
44
45#[async_trait]
48pub trait RawHandler {
49 fn selector(&self) -> &WorkerSelector;
52
53 fn output_format(&self) -> TaskDataFormat;
55
56 fn supported_task(&self) -> Option<SupportedTask>;
59
60 async fn run(&self, context: TaskContext, task: TaskDefinition) -> eyre::Result<Vec<u8>>;
62}
63
64#[doc(hidden)]
66pub mod _private {
67 use tokio_util::sync::CancellationToken;
68 use uuid::Uuid;
69
70 use crate::TaskContext;
71
72 #[must_use]
73 pub fn new_context(task_id: Uuid, cancellation: CancellationToken) -> TaskContext {
74 TaskContext {
75 task_id,
76 cancellation,
77 }
78 }
79}