atex 0.3.0

Lib for async local task evaluation(sqlite or in-memory)
Documentation
use crate::proto::{DynFut, ILogger, IWrappedTaskExecutor};
use crate::{ITaskController, ITaskExecutor, Task, TaskStatus};
use std::sync::Arc;

pub struct WrappedTaskExecutor<L: ILogger, E: ITaskExecutor> {
    logger: Arc<L>,
    executor: E,
}

impl<L: ILogger, E: ITaskExecutor> WrappedTaskExecutor<L, E> {
    pub fn new(logger: Arc<L>, executor: E) -> Self {
        Self { logger, executor }
    }
}

impl<L: ILogger + 'static, E: ITaskExecutor + 'static> IWrappedTaskExecutor
    for WrappedTaskExecutor<L, E>
{
    fn name(&self) -> &'static str {
        self.executor.name()
    }

    fn periodic_interval(&self) -> Option<u64> {
        self.executor.periodic_interval()
    }

    fn lock_key(&self, payload: &str) -> String {
        self.executor.lock_key(payload)
    }

    fn execute(&self, ctrl: Box<dyn ITaskController>, task: Task) -> DynFut<TaskStatus> {
        let fut = self.executor.execute(ctrl, task);
        let logger = self.logger.clone();
        Box::pin(async move {
            match fut.await {
                Ok(status) => status,
                Err(err) => {
                    let msg = format!("{:?}", err);
                    logger.log(&msg);
                    TaskStatus::Error(msg)
                }
            }
        })
    }
}