#process #cmd #shell #bash

devx-cmd

Convenience wrapper over std::process::Command for xtask crates

6 releases (breaking)

0.5.0 Jun 2, 2021
0.4.0 May 28, 2021
0.3.1 Sep 22, 2020
0.3.0 Aug 29, 2020
0.1.0 Aug 16, 2020

#197 in Rust patterns

Download history 3964/week @ 2021-04-10 2869/week @ 2021-04-17 4368/week @ 2021-04-24 1951/week @ 2021-05-01 3807/week @ 2021-05-08 4580/week @ 2021-05-15 4096/week @ 2021-05-22 3005/week @ 2021-05-29 4781/week @ 2021-06-05 5484/week @ 2021-06-12 5464/week @ 2021-06-19 4295/week @ 2021-06-26 6039/week @ 2021-07-03 4127/week @ 2021-07-10 4535/week @ 2021-07-17 3735/week @ 2021-07-24

12,806 downloads per month
Used in devx-pre-commit

MIT/Apache

26KB
412 lines

devx-cmd

devx-cmd provides more convenient primitives for spawning child processes than std::process targeted for use in development scripts specifically.

See the crate-level docs for more info.


lib.rs:

devx-cmd provides more convenient primitives for spawning child processes than [std::process] targeted for use in development scripts specifically.

The main entities of the crate are [Cmd] (builder for executable commands), and [Child] (represents a spawned process).

There are also some convenient macros to reduce boilerplate. Here is the basic usage example:

use devx_cmd::{read, run, cmd, Cmd};

// Initialize some low-overhead logger implementation for the `log` crate
simple_logger::SimpleLogger::new().init().unwrap();

// Run the program, logging the invocation via [`log`] crate and waiting until it finishes
// This is used only for side-effects.
// Note that if the process ends with a non-zero status code, this will return an error.
run!("ls", "-la")?;

// Same as `run!()`, but captures the stdout and returns it as a `String`
// there is also a `read_bytes!()` for non-utf8 sequences
let output = read!("echo", "foo")?;
assert_eq!(output.trim(), "foo");

# if run!("rustfmt", "--version").is_ok() {
let mut cmd = cmd!("rustfmt");
cmd
    // Set `trace` level for logging command invocation and output (`debug` by default)
    .log_cmd(log::Level::Trace)
    // Don't log error if the command fails
    .log_err(None)
    .stdin("fn foo () -> u32 {42}\n");

// Spawn without waiting for its completion, but capturing the stdout
let mut child = cmd.spawn_piped()?;

// Read output line-by-line
let first_line = child.stdout_lines().next().unwrap();

assert_eq!(first_line.trim(), "fn foo() -> u32 {");

// Dropping the child process `kill()`s it (and ignores the `Result`)
// Use `.wait()/.read()` to wait until its completion.
drop(child);
# }

# Ok::<(), devx_cmd::Error>(())

Dependencies

~82KB