#stdio #pipe #stdout #stdin #command-line #broken-pipe

std_io_iterators

用于 STDIN 的迭代器和 STDOUT 的包装器。允许轻松管道操作,并在管道断裂时优雅地关闭应用程序

1 个稳定版本

1.0.0 2022年11月25日

#1426Rust 模式

MIT 许可证

23KB
277

std_io_iterators

用于 STDIN 的迭代器和 STDOUT 的包装器。允许轻松管道操作,并在管道断裂时优雅地关闭应用程序

SnS Development 项目提供

问题

使用 STDINSTDOUT(管道输入或输出)比必要的更复杂。开发者应该能够通过 STDIN 获取要管道输入的数据的迭代器,并应该能够通过 STDOUT 简单地输出任何实现了 std::fmt::Debug 特性的迭代器。

此外,如果 STDOUT 管道“损坏”(即管道输入的数据退出),则通过 STDOUT 输出的迭代器应该是可恢复的,以便可以重新定向数据。(见 prelude::PipeOut::pipe_out 的警告)

解决方案

  • 一个结构体 prelude::PipeInIterator - 一个 [Iterator],抽象了通过 STDIN 管道输入的过程
  • 一个特质 prelude::PipeOut - 实现了任何迭代器,它遍历实现 std::fmt::Debug 特性(如 [String])的元素,并抽象了通过 STDOUT 管道输出的过程

示例

use std_io_iterators::prelude::*;

fn main() -> Result<(), std::io::Error> {
    // Pipe in, lazy transform, pipe out
    match PipeInIterator::try_new()
        .expect("1669235203 - Unable to lock STDIN")
        .map(INTERNAL_FUNCTION)
        .pipe_out()
    {
        Err(e) if e.is_broken_pipe() => {
            // Log Broken Pipe
            return Ok(());
        }
        Err(e) => return e.dump_data().into(),
        _ => (),
    }

    // Pipe out array, re-direct additional data
    if let Err(mut e) = (["test1", "test2", "test3"].iter()).pipe_out() {
        e.by_ref()
            .for_each(|_recovered_datum| todo!("Handle recovered data"));
        return e.result.into();
    }

    Ok(())
}

const INTERNAL_FUNCTION: fn(std::rc::Rc<String>) -> String =
    |line| format!("Prepend-{}", line);

如何:更新文档

此项目的文档包含在代码中的文档注释中。然后,通过 rustdoc 将这些注释编译成项目最终的文档,当代码发布时。

在源代码根目录中包含一个 README.md 文件以在相应的版本管理系统中进行显示是良好的实践。遵循 DRY 原则

系统中的每一项知识都必须有一个单一、明确、权威的表示

为了防止文件与文档不同步,我通过包含的脚本简单地复制文档的根页。

update_documentation.sh 在项目根目录下运行

# Update CargoDocs from source code
cargo doc

# Update README.md from source code
cargo readme > README.md

许可证:MIT

无运行时依赖