use std::future::Future;
use std::pin::Pin;
use async_trait::async_trait;
use turul_mcp_protocol::TaskStatus;
use turul_mcp_task_storage::TaskStorageError;
pub trait TaskHandle: Send + Sync {
fn cancel(&self);
fn is_cancelled(&self) -> bool;
}
pub type BoxedTaskWork = Box<
dyn FnOnce() -> Pin<Box<dyn Future<Output = turul_mcp_task_storage::TaskOutcome> + Send>>
+ Send,
>;
#[async_trait]
pub trait TaskExecutor: Send + Sync {
async fn start_task(
&self,
task_id: &str,
work: BoxedTaskWork,
) -> Result<Box<dyn TaskHandle>, TaskStorageError>;
async fn cancel_task(&self, task_id: &str) -> Result<(), TaskStorageError>;
async fn await_terminal(&self, task_id: &str) -> Option<TaskStatus>;
}