use std::pin::Pin;
use async_trait::async_trait;
use solti_model::{
AdmissionPolicy, OutputEvent, Task, TaskId, TaskPage, TaskQuery, TaskRun, TaskSpec,
};
use tokio_stream::Stream;
use crate::error::ApiError;
pub type OutputEventStream = Pin<Box<dyn Stream<Item = OutputEvent> + Send + 'static>>;
#[async_trait]
pub trait ApiHandler: Send + Sync + 'static {
async fn submit_task(&self, spec: TaskSpec) -> Result<TaskId, ApiError>;
async fn apply_task(&self, spec: TaskSpec) -> Result<TaskId, ApiError> {
self.submit_task(spec.with_admission(AdmissionPolicy::Replace))
.await
}
async fn get_task_status(&self, id: &TaskId) -> Result<Option<Task>, ApiError>;
async fn query_tasks(&self, query: TaskQuery) -> Result<TaskPage<Task>, ApiError>;
async fn list_task_runs(&self, id: &TaskId) -> Result<Vec<TaskRun>, ApiError>;
async fn delete_task(&self, id: &TaskId) -> Result<(), ApiError>;
async fn stream_task_logs(&self, _id: &TaskId) -> Result<OutputEventStream, ApiError> {
Ok(Box::pin(tokio_stream::empty()))
}
}