use std::error::Error;
use std::sync::Arc;
use async_trait::async_trait;
use tokio::sync::Mutex;
use tokio::sync::mpsc::{Receiver, Sender};
use crate::config::Config;
use crate::transform::TransformAttempt;
#[async_trait]
pub trait WorkerManager: Send {
type TransformAttempt: TransformAttempt;
type WorkerManagerError: Error + Send;
type Config: Config;
async fn new(
init_config: Arc<Mutex<Self::Config>>,
recv_channel: Receiver<Self::TransformAttempt>,
send_channel: Sender<WorkerManagerResult<Self::TransformAttempt>>,
) -> Result<Self, Self::WorkerManagerError>
where
Self: Sized;
async fn wm_loop(&mut self) -> Result<(), Self::WorkerManagerError>;
}
#[derive(Debug, Clone)]
pub enum WorkerManagerResult<T: TransformAttempt> {
Success(T::Identifier, T::ReturnPackage),
Failure(T::Identifier, T::ReturnPackage),
}