puniyu_loader 0.8.18

Puniyu 加载器类型定义库,提供统一的 Loader trait 和组件发现类型
Documentation
use async_trait::async_trait;
use std::sync::Arc;

use puniyu_loader::{Loader, LoadContext, ComponentSet};

struct TestLoader;

#[async_trait]
impl Loader for TestLoader {
    fn name(&self) -> &'static str {
        "test_loader"
    }

    async fn discover(&self, _ctx: &LoadContext) -> puniyu_error::Result<ComponentSet> {
        Ok(ComponentSet {
            adapters: vec![],
            plugins: vec![],
        })
    }
}

#[tokio::test]
async fn test_loader_name() {
    let loader = TestLoader;
    assert_eq!(loader.name(), "test_loader");
}

#[tokio::test]
async fn test_loader_discover_empty() {
    let loader = TestLoader;
    let ctx = LoadContext {
        app_name: "test",
        cwd_dir: std::env::current_dir().unwrap(),
    };
    let result = loader.discover(&ctx).await;
    assert!(result.is_ok());
    let set = result.unwrap();
    assert!(set.adapters.is_empty());
    assert!(set.plugins.is_empty());
}

#[tokio::test]
async fn test_loader_trait_object() {
    let loader: Arc<dyn Loader> = Arc::new(TestLoader);
    assert_eq!(loader.name(), "test_loader");
    let ctx = LoadContext {
        app_name: "test",
        cwd_dir: std::env::current_dir().unwrap(),
    };
    let set = loader.discover(&ctx).await.unwrap();
    assert!(set.adapters.is_empty());
    assert!(set.plugins.is_empty());
}

#[tokio::test]
async fn test_loader_discover_with_context() {
    let loader = TestLoader;
    let ctx = LoadContext {
        app_name: "my_app",
        cwd_dir: std::path::PathBuf::from("/tmp"),
    };
    assert_eq!(ctx.app_name, "my_app");
    let set = loader.discover(&ctx).await.unwrap();
    assert!(set.adapters.is_empty());
    assert!(set.plugins.is_empty());
}