Skip to main content

solti_api/
adapter.rs

1//! # Supervisor adapter.
2//!
3//! [`SupervisorApiAdapter`] bridges [`SupervisorApi`](solti_core::SupervisorApi) to [`ApiHandler`].
4
5use std::sync::Arc;
6
7use async_trait::async_trait;
8use solti_core::SupervisorApi;
9use solti_model::{Task, TaskId, TaskPage, TaskQuery, TaskRun, TaskSpec};
10
11use crate::error::ApiError;
12use crate::handler::ApiHandler;
13
14/// Adapter that bridges [`SupervisorApi`] to [`ApiHandler`].
15///
16/// Ready-to-use implementation that directly delegates to `SupervisorApi`.
17///
18/// ## Also
19///
20/// - [`ApiHandler`] the trait this adapter implements.
21/// - [`ApiError::Core`] wraps `CoreError` from the supervisor.
22pub struct SupervisorApiAdapter {
23    supervisor: Arc<SupervisorApi>,
24}
25
26impl SupervisorApiAdapter {
27    /// Create a new adapter wrapping the given supervisor.
28    pub fn new(supervisor: Arc<SupervisorApi>) -> Self {
29        Self { supervisor }
30    }
31}
32
33#[async_trait]
34impl ApiHandler for SupervisorApiAdapter {
35    async fn submit_task(&self, spec: TaskSpec) -> Result<TaskId, ApiError> {
36        self.supervisor.submit(&spec).await.map_err(ApiError::from)
37    }
38
39    async fn get_task_status(&self, id: &TaskId) -> Result<Option<Task>, ApiError> {
40        Ok(self.supervisor.get_task(id))
41    }
42
43    async fn query_tasks(&self, query: TaskQuery) -> Result<TaskPage<Task>, ApiError> {
44        Ok(self.supervisor.query_tasks(&query))
45    }
46
47    async fn list_task_runs(&self, id: &TaskId) -> Result<Vec<TaskRun>, ApiError> {
48        Ok(self.supervisor.list_task_runs(id))
49    }
50
51    async fn delete_task(&self, id: &TaskId) -> Result<(), ApiError> {
52        self.supervisor
53            .delete_task(id)
54            .await
55            .map_err(ApiError::from)
56    }
57}