1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2017年12月22日 |
---|
9 在 #transforming 中排名
228 每月下载量
在 10 个包中使用(通过 unzip)
10KB
114 行
转换管道
数据转换的中间件式 API。
功能
- 定义在阶段之间传递的自定义数据类型
- 简单管道流程暴露给阶段:终止、完成(提前)、跳过
- 包装函数以运行整个管道
潜在未来功能
- 子管道(例如:路由器)
用法
安装
将 transformation-pipeline
添加到您的 Cargo.toml
文件中,并将其作为外部包添加。
extern crate transformation_pipeline;
定义数据
识别或定义将在阶段之间传递的数据类型。
这可以是内置的,如 String
,或自定义 struct
。然而,数据类型必须定义了 Clone
特性。
use std::clone::Clone;
struct User {
name: String,
}
impl Clone for User {
fn clone(&self) -> Self {
User {
name: self.name.clone(),
}
}
}
创建阶段
为管道的每个阶段创建 struct
,并为每个阶段实现 PipelineStage
特性。
use transformation_pipeline::PipelineStage;
use transformation_pipeline::StageResult;
use transformation_pipeline::StageActions;
struct MyPipelineStage {}
impl TransformationStage<User> for MyPipelineStage {
fn run(&self, previous: User) -> StageResult<User> {
let mut name: String = "John ".to_owned();
name.push_str(&previous.name);
Ok(StageActions::Next(User {
name: name,
}))
}
}
有关不同操作的更多信息,请参阅 阶段操作。
创建管道
现在您可以使用创建的阶段组装管道。每个阶段都必须放入 Box
中,这是一个内置类型。
use transformation_pipeline::TransformationPipeline;
let pipeline: TransformationPipeline<User> = TransformationPipeline::new(vec![
Box::new(MyPipelineStage {}),
// Add other stages here:
// Box::new(MyOtherPipelineStage {})
]);
使用管道
现在您可以向管道传递数据
let input: User = User {
name: "Doe"
};
let output = pipeline.run(input).unwrap();
assert_eq!(output.name, "John Doe");
文档
阶段操作
管道的每个阶段都必须以某种“操作”完成。
下一操作
标准操作是“下一操作”,它将给定的数据传递到下一个管道阶段。如果阶段是管道中的最后一个阶段,则给定的数据作为管道结果返回。
Ok(StageActions::Next( /* data for next stage */ ))
跳过操作
阶段可以以“跳过”操作完成,这将从当前阶段开始启动下一个管道阶段,就像当前阶段从未存在过一样。
这相当于调用
return Ok(StageActions::Next(previous));
但它可以更明确地说明正在发生的事情
if /* action is already completed */ {
return Ok(StageActions::Skip);
}
/* Do action */
Ok(StageActions::Next( /* ... */ ))
完成操作
阶段可以导致管道立即以“完成”操作完成。这返回给定的数据作为管道结果,并且不会运行任何其他阶段。
Ok(StageActions::Finish(/* final data */ ))
跳跃操作
阶段可以使用“跳跃”操作跳过管道中的后续步骤。这将给定的数据传递到管道中更低的阶段,并且不会运行任何中间阶段。
// SAME AS Next():
return Ok(StageActions::Skip(0, /* next data */ ));
// Skips 1 stage:
return Ok(StageActions::Skip(1, /* data to pass to the 2nd stage */ ));
终止操作
阶段可以以“终止”操作完成,导致整个管道以错误终止。
Ok(StageActions::Abort)
(反)目的/替代方案
此包不是设计用于
- 处理阶段之间的不同数据类型(例如连续的映射)
- 管道阶段暴露多个功能(例如:花哨的插件)
cargo-plugin可能是通用插件的更好选择。