12 个版本 (稳定)
3.0.1 | 2023年12月13日 |
---|---|
2.0.3 | 2022年12月15日 |
2.0.0 | 2022年8月8日 |
1.0.3 | 2021年10月4日 |
0.1.4 | 2021年8月18日 |
#495 in Rust 模式
每月24次下载
用于 4 crates
110KB
1.5K SLoC
RailsGun
RailsGun 或 Railgun,怎么叫都行。这个crate为现有的 Rust Rail 架构添加了许多小而宝贵的功能。
如果你习惯在 Rust 中使用 Rails,你就知道这一切!如果你第一次听说它,我强烈建议你阅读以下内容 面向 Rails 的编程;简而言之,这是一种我在多个项目和服务中找到的编程风格,可以减少错误。
这个crate为你提供了一些额外缺失的工具和简化,如下所示
tap, tap_err, tap_ref, tap_err_ref
这是一个出色的 trait,它添加了“tap”内容的能力。这意味着你可以获得原始内容的副本/克隆,你可以使用它进行分析或其他破坏性操作,而实际上并不接触原始内容。
注意:
tap_ref
和tap_err_ref
不幸地只是一个引用,所以不应该进行破坏性操作。
merge, merge2, merge3, merge4
这是用于合并多个结果。如果你以前使用过 Rails,你可能尝试过以下方法
use railsgun::Merge;
fn func_xyz(x: u32, y: u32, z: u32) -> Result<u32,u32> {
Ok( x + y + z)
}
let x = Ok(1);
let y = Ok(2);
let z = Ok(3);
x.and_then(|var_x|
y.and_then(|var_y|
z.and_then(|var_z|
func_xyz(var_x, var_y, var_z)
)
)
).ok();
这是一个将三个结果组合在一起的糟糕方法,你可以将其拆分成多个函数,但有时这样做非常过度。Merge为你提供了更优越的功能。
use railsgun::Merge;
fn func_xyz(x: u32, y: u32, z: u32) -> Result<u32,u32> {
Ok( x + y + z)
}
# async fn run() -> () {
let x = Ok(1);
let y = Ok(2);
let z = Ok(3);
x.merge2(y, z, |var_x, var_y, var_z| func_xyz(var_x, var_y, var_z)).ok();
# }
如你所见,这简化了 rail,并使其更易于阅读/维护。
Trait BlockInPlaceResult
这个 trait 要求你的系统当前正在 Tokio 线程中运行,因为它需要多线程。话虽如此,它在上面的结果上添加了一些有趣的功能。如果你下面的内容让你感到烦恼
async fn my_async_fn() -> Result<String, String> {
Ok("Something awesome".to_string())
}
# async fn run() -> () {
my_async_fn().await.map(|t| println!("{}", t)).ok();
# };
这允许你通过以下方式来节省时间
use railsgun::BlockInPlaceResult;
async fn my_async_fn() -> Result<String, String> {
Ok("Something awesome".to_string())
}
# async fn run() -> () {
my_async_fn().map(|t| format!("{}", t)).ok();
# };
请注意,这是使用 tokio block_in_place
进行执行。
AsyncResult
正如其名所描述的,这是一个 AsyncResult
。它几乎拥有 Result
所有的功能,还有一些其他额外功能。这使得您可以通过以下方式在您的轨道内执行 async
函数和代码:
use railsgun::AsyncResult::{self, *};
async fn do_something(t: &str) -> AsyncResult<&str,&str> {
Ok(t)
}
# async fn run() -> () {
let x = Ok("foo");
x.async_and_then(|t| do_something(t)).await
.async_and_then(|t| async move { Ok(t) }).await
.ok();
# };
当然,这并不是最漂亮的方法,但它允许系统保持在其轨道上,继续处理而无需进出轨道。
当然,这也包括为 Result
实现了 From
/Into
,甚至还包括一个更易于理解的 into_async
/into_sync
实现,用于在 AsyncResult
和 Result
之间进行转换。
待办事项
对于这个库以及其他的文档来说,有很大的需求,因为这个库在我的私人栈中已经存放了很长时间,并没有得到它所需要的文档关怀。
- tap 需要 doc
- merge 需要 doc
- 为
AsyncResult
实现BlockInPlace
- 需要更多的单元测试。
请为更多想法提交工单!
贡献
欢迎您为该项目做出贡献。目前,该项目托管在 GitHub 和我的私人 GitLab 上:GitHub 和 GitLab。主仓库是 GitLab 仓库,其中包含所有管道和我的项目。
许可证
MIT 许可证 (MIT)
版权所有 © 2021
以下条件之下,任何人获得此软件及其相关文档文件(“软件”)的副本,均可免费使用该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向软件提供者提供软件的人这样做,具体条件如下:
上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。
软件按“现状”提供,不提供任何形式的保证,无论是明示的、暗示的,还是关于适销性、特定用途适用性或非侵权的保证。在任何情况下,作者或版权所有者均不对因使用或与软件或其使用有关而引起的任何索赔、损害或其他责任负责,无论是基于合同、侵权或其他方式产生的。
依赖关系
~2.2–3.5MB
~63K SLoC