#data-pipeline #data-transformation #stage #transforming #api #action #middleware-esque

transformation-pipeline

数据转换的中间件式 API

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2017年12月22日

9#transforming 中排名

Download history 134/week @ 2024-03-15 215/week @ 2024-03-22 178/week @ 2024-03-29 156/week @ 2024-04-05 78/week @ 2024-04-12 87/week @ 2024-04-19 86/week @ 2024-04-26 53/week @ 2024-05-03 163/week @ 2024-05-10 58/week @ 2024-05-17 69/week @ 2024-05-24 76/week @ 2024-05-31 39/week @ 2024-06-07 80/week @ 2024-06-14 79/week @ 2024-06-21 24/week @ 2024-06-28

228 每月下载量
10 个包中使用(通过 unzip

MIT 许可证

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可能是通用插件的更好选择。

无运行时依赖