fs-mel 0.9.2

Mélodium core filesystem interaction library
use async_trait::async_trait;
use core::{future::Future, pin::Pin};
use melodium_core::*;
use melodium_macro::mel_data;
use std::{fmt::Debug, sync::Arc};

pub type OnceTriggerCall<'a> =
    Box<dyn FnOnce() -> Pin<Box<dyn Future<Output = ()> + Send + 'a>> + Send + Sync + 'a>;
pub type OnceMessageCall<'a> =
    Box<dyn FnOnce(String) -> Pin<Box<dyn Future<Output = ()> + Send + 'a>> + Send + Sync + 'a>;
pub type OutU128Call<'a> = Box<
    dyn Fn(u128) -> Pin<Box<dyn Future<Output = Result<(), ()>> + Send + 'a>> + Send + Sync + 'a,
>;
pub type OutMessageCall<'a> = Box<
    dyn Fn(String) -> Pin<Box<dyn Future<Output = Result<(), ()>> + Send + 'a>> + Send + Sync + 'a,
>;
pub type InDataCall<'a> = Box<
    dyn Fn() -> Pin<Box<dyn Future<Output = Result<Vec<u8>, ()>> + Send + 'a>> + Send + Sync + 'a,
>;
pub type OutDataCall<'a> = Box<
    dyn Fn(VecDeque<u8>) -> Pin<Box<dyn Future<Output = Result<(), ()>> + Send + 'a>>
        + Send
        + Sync
        + 'a,
>;

#[async_trait]
pub trait FileSystemEngine: Debug + Send + Sync {
    async fn read_file(
        &self,
        path: &str,
        data: OutDataCall<'async_trait>,
        reached: OnceTriggerCall<'async_trait>,
        reachedclose: OnceTriggerCall<'async_trait>,
        completed: OnceTriggerCall<'async_trait>,
        failed: OnceTriggerCall<'async_trait>,
        finished: OnceTriggerCall<'async_trait>,
        errors: OutMessageCall<'async_trait>,
    );
    async fn write_file(
        &self,
        path: &str,
        append: bool,
        create: bool,
        new: bool,
        data: InDataCall<'async_trait>,
        amount: OutU128Call<'async_trait>,
        completed: OnceTriggerCall<'async_trait>,
        failed: OnceTriggerCall<'async_trait>,
        finished: OnceTriggerCall<'async_trait>,
        errors: OutMessageCall<'async_trait>,
    );
    async fn create_dir(
        &self,
        path: &str,
        recursive: bool,
        success: OnceTriggerCall<'async_trait>,
        failed: OnceTriggerCall<'async_trait>,
        error: OnceMessageCall<'async_trait>,
    );
    async fn scan_dir(
        &self,
        path: &str,
        recursive: bool,
        follow_links: bool,
        entries: OutMessageCall<'async_trait>,
        completed: OnceTriggerCall<'async_trait>,
        failed: OnceTriggerCall<'async_trait>,
        finished: OnceTriggerCall<'async_trait>,
        errors: OutMessageCall<'async_trait>,
    );
}

#[derive(Debug, Serialize)]
#[mel_data]
pub struct FileSystem {
    #[serde(skip)]
    pub filesystem: Arc<dyn FileSystemEngine>,
}