#exit-status #process #command #mocking #child #execute-command #env-var

mapped-command

std::process::Command 的替代版本,可以映射自定义结果并检查退出状态

1 个不稳定版本

0.3.0 2021年1月25日

#433操作系统

MIT/Apache

110KB
2K SLoC

mapped-command

版本 0.2.x 是 std::process::Command 的扩展 trait,可以在以下位置找到:在 0.2 分支

提供 rust 的 std::process::Command 的替代方案,更易于测试、更灵活,并防止程序员忘记检查子进程的退出状态而导致的错误。(但 std::process::Command 中的错误是关于无法启动子进程,并不关心退出代码)。

目前这个库专注于等待子进程完成并映射输出的情况(或对输出不关心)。

当前类型包含以下功能

  • 默认检查退出状态

  • 将捕获的 stdout/stderr 映射到一个结果中,即 Command 类型是 Command<Output, Error>,例如 Command<Vec<String>, Error>

  • 隐式定义是否需要捕获 stdout/stderr,以防止在此方面出错,这是通过与定义输出映射相同的机制来实现的,例如 Command::new("ls", ReturnStdoutString) 将隐式启用 stdout 捕获并禁用 stderr 捕获。

  • 允许使用回调替换命令执行,这主要用于允许模拟命令。

  • 除了允许决定子过程是否继承环境以及哪些变量被删除/设置/覆盖外,此类型还允许您白名单应继承哪些环境变量。

  • 不要通过基于API的方式传递&mut self。这使得创建创建并返回命令的函数变得更加麻烦,而这些类型的意图是使其变得简单,例如,您可以有如下函数:fn ls_command() -> Command<Vec<String>, Error>,该函数返回一个命令,如果运行,则运行ls命令并返回一个字符串向量(或者在创建、运行或UTF-8验证失败时返回错误)。

  • 对输出和错误类型进行泛型处理,但在如何将捕获的stdout/err映射到给定的Result<Output, Error>上动态处理。这允许您在运行时在不同的函数之间切换,这些函数创建具有相同输出的命令,但以不同的方式(即通过不同的调用程序和输出映射,例如根据配置设置)。

迷你示例

使用cargo run --example readme运行此命令

use mapped_command::{Command, CommandExecutionWithStringOutputError as Error, MapStdoutString};

fn ls_command() -> Command<Vec<String>, Error> {
    Command::new(
        "ls",
        MapStdoutString(|out| {
            let lines = out.lines().map(Into::into).collect::<Vec<_>>();
            Ok(lines)
        }),
    )
}

fn main() {
    let entries = ls_command().run().unwrap();
    println!("ls:");
    for entry in entries {
        println!("\t{}", entry);
    }
}

有关其他示例,例如关于模拟的工作方式,请参阅示例目录或rustdoc生成的模块级文档,这些文档可能托管在docs.rs上。请注意,该链接指向最新发布的版本,如果尚未发布更新,可能因此与版本不同步。

许可协议

根据您的选择,许可协议为以下之一

贡献

除非您明确说明,否则根据Apache-2.0许可证定义的,您有意提交的任何贡献,都应如上所述进行双重许可,不附加任何额外条款或条件。

依赖关系

~320–790KB
~19K SLoC