use crate::prelude::{AbstractTaskStorage, Task};
use async_trait::async_trait;
use serde::{de::DeserializeOwned, Serialize};
use std::sync::Arc;
use thiserror::Error;
use super::worker::WorkerId;
#[derive(Error, Debug)]
pub enum ComputationError {
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("Database error: {0}")]
Db(String),
#[error("Task storage error: {0}")]
Storage(String),
#[error("Task error: {0}")]
Task(String),
#[error("Computation execution error: {0}")]
Function(String),
#[error("Max retries: {0}")]
MaxRetries(String),
}
#[async_trait]
pub trait Computation<Data, Ctx>
where
Data: Clone + Serialize + DeserializeOwned + Send + Sync + 'static,
Ctx: Send + Sync + 'static,
{
async fn call(
&self,
worker_id: WorkerId,
ctx: Arc<Ctx>,
storage: AbstractTaskStorage<Data>,
task: &mut Task<Data>,
) -> Result<(), ComputationError>;
}