Skip to content

eyouyou/pipeline

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pipeline

Rust 异步拦截器(aspect / pipeline)模型,以及在其之上构建的任务编排库(fallback / sequence / parallel)。

特性

  • 通用拦截器:每次调用都会产生整条管线的拷贝,拦截器自身不保存状态。
  • 函数式存储模型:状态只能在 AspectContext 中流转,除 context 外所有拦截器保持幂等。
  • 高阶设计:将 add => 1, 2, 3 折叠为 Z1(Z2(Z3(next)))(context) 的洋葱式调用链。

Crate 布局

Crate 内容
pipeline 内核:Pipeline / Item / INextItem / AspectContext
samples 在内核之上构建的任务流:StrategicTaskFlowSequenceTaskParallelTaskFallback

一眼看懂

use pipeline::{AspectContext, INextItem, Item, NextItem, Pipeline, PipelineResult};

#[derive(Clone)]
struct LogTask;

#[async_trait::async_trait]
impl Item<()> for LogTask {
    async fn invoke(
        &self,
        next: &Box<NextItem<()>>,
        ctx: &mut AspectContext<()>,
    ) -> PipelineResult<()> {
        println!("before");
        next.invoke_next(ctx).await?;
        println!("after");
        Ok(())
    }
}

let mut line = Pipeline::default();
line.use_raw_item(LogTask);
line.invoke_next(&mut AspectContext::new(())).await?;

更完整的任务编排示例见 TaskFlow sample

License

MIT