use std::fmt::Debug;
use std::process::ExitStatus;
use anyhow::Result;
use async_trait::async_trait;
use futures::future::BoxFuture;
use nonempty::NonEmpty;
use tokio_util::sync::CancellationToken;
use crate::Task;
pub mod docker;
pub mod generic;
pub mod tes;
#[derive(Debug, thiserror::Error)]
pub enum TaskRunError {
#[error("the task has been canceled")]
Canceled,
#[error("the task has been preempted")]
Preempted,
#[error(transparent)]
Other(#[from] anyhow::Error),
}
#[async_trait]
pub trait Backend: Debug + Send + Sync + 'static {
fn default_name(&self) -> &'static str;
fn run(
&self,
task: Task,
token: CancellationToken,
) -> Result<BoxFuture<'static, Result<NonEmpty<ExitStatus>, TaskRunError>>>;
}