wae-effect 0.0.0

WAE Effect - 代数效应依赖注入,声明式依赖获取
Documentation

WAE Effect - 代数效应风格的依赖注入模块

提供声明式的依赖获取能力,通过 Effectful 参数统一管理所有依赖。

设计理念

传统模式需要在函数签名中声明所有依赖:

async fn handler(
    State(db): State<Database>,
    State(cache): State<Cache>,
    Extension(user): Extension<AuthenticatedUser>,
) { ... }

代数效应模式通过单一参数统一管理:

async fn handler(e: Effectful) {
    let db = e.use_database().await?;
    let user = e.use_auth().await?;
}

优势

  • 声明式: 依赖在函数体内按需获取
  • 类型安全: 编译时检查依赖类型
  • 可测试: 轻松 mock 依赖
  • 组合性: 依赖可以嵌套组合

代数效应模块 - 提供依赖注入和代数效应系统。

主要功能

  • 依赖注入: 类型安全的依赖管理
  • 代数效应: 函数式编程风格的副作用处理
  • 上下文管理: 请求上下文传递
  • 组合式 API: 链式构建依赖容器

核心概念

  • AlgebraicEffect - 效应构建器
  • Dependencies - 依赖容器
  • Effectful - 效应执行器

使用示例

use wae_effect::{AlgebraicEffect, Dependencies, Effectful};
use serde::Deserialize;

#[derive(Debug, Clone, Deserialize)]
struct AppConfig {
    app_name: String,
    version: String,
}

#[derive(Debug, Clone)]
struct User {
    id: String,
    username: String,
}

#[tokio::main]
async fn main() {
    let deps = AlgebraicEffect::new()
        .with_config(AppConfig {
            app_name: "My App".to_string(),
            version: "1.0.0".to_string(),
        })
        .with_auth(User {
            id: "001".to_string(),
            username: "admin".to_string(),
        })
        .build();
    
    let config = deps.get::<AppConfig>()?;
    let user = deps.get::<User>()?;
}

在 Axum 中使用

use axum::Router;
use wae_effect::Effectful;

async fn handler(ae: Effectful) -> Result<Json<Response>, EffectError> {
    let config = ae.use_config::<AppConfig>().await?;
    let user = ae.use_auth::<User>().await?;
    Ok(Json(Response { user }))
}

let app = Router::new()
    .route("/api", get(handler))
    .with_state(deps);