acts-next 0.15.6

a fast, tiny, extensiable workflow engine
Documentation
use crate::{
    store::{data, DbSet, PageData, Query, StoreAdapter, StoreKind},
    Builder, Result,
};
use std::sync::Arc;
use tokio::sync::OnceCell;

static STORE: OnceCell<TestStore> = OnceCell::const_new();
async fn init() -> TestStore {
    TestStore::new()
}

async fn store() -> &'static TestStore {
    STORE.get_or_init(init).await
}

#[tokio::test]
async fn adapter_set_extern_store_test() {
    let store = store().await;
    let engine = Builder::new().store(store).build();
    let store = engine.runtime().cache().store();
    assert_eq!(store.kind(), StoreKind::Extern);
    store.reset();
}

#[derive(Debug, Clone)]
pub struct TestStore {
    models: Collect<data::Model>,
    procs: Collect<data::Proc>,
    tasks: Collect<data::Task>,
    packages: Collect<data::Package>,
    messages: Collect<data::Message>,
}

impl TestStore {
    pub fn new() -> Self {
        Self {
            models: Collect::new(),
            procs: Collect::new(),
            tasks: Collect::new(),
            packages: Collect::new(),
            messages: Collect::new(),
        }
    }
}

impl StoreAdapter for TestStore {
    fn init(&self) {}
    fn close(&self) {}

    fn models(&self) -> Arc<dyn DbSet<Item = data::Model>> {
        Arc::new(self.models.clone())
    }

    fn procs(&self) -> Arc<dyn DbSet<Item = data::Proc>> {
        Arc::new(self.procs.clone())
    }

    fn tasks(&self) -> Arc<dyn DbSet<Item = data::Task>> {
        Arc::new(self.tasks.clone())
    }

    fn packages(&self) -> Arc<dyn DbSet<Item = data::Package>> {
        Arc::new(self.packages.clone())
    }

    fn messages(&self) -> Arc<dyn DbSet<Item = data::Message>> {
        Arc::new(self.messages.clone())
    }
}

#[derive(Debug, Clone)]
pub struct Collect<T> {
    _data: Vec<T>,
}

impl<T> Collect<T> {
    pub fn new() -> Self {
        Self { _data: Vec::new() }
    }
}

impl<T> DbSet for Collect<T>
where
    T: Send + Sync,
{
    type Item = T;
    fn exists(&self, _id: &str) -> Result<bool> {
        Ok(false)
    }

    fn find(&self, _id: &str) -> Result<Self::Item> {
        Err(crate::ActError::Store(format!(
            "not found model id={}",
            _id
        )))
    }

    fn query(&self, _q: &Query) -> Result<PageData<Self::Item>> {
        Ok(PageData {
            count: 0,
            page_size: 50,
            page_num: 1,
            page_count: 0,
            rows: vec![],
        })
    }

    fn create(&self, _data: &Self::Item) -> Result<bool> {
        Ok(false)
    }
    fn update(&self, _data: &Self::Item) -> Result<bool> {
        Ok(false)
    }
    fn delete(&self, _id: &str) -> Result<bool> {
        Ok(false)
    }
}