Rust :: Crates

Useful Crates

Testing

assert_cmd

use assert_cmd::Command;
let mut cmd = Command::cargo_bin("hello").unwrap();
cmd.assert().success();
// expect failure
cmd.assert().failure().stderr("expected error");

// add args to the command
cmd.arg("-n").arg("-f").assert().success().stdout("expected output");
// multiple args
cmd.args(&["-f", "-n"]).assert().success().stdout("expected output");

Parsing Arguments

structopt and clap

// clap-verbosity-flag crate can add --verbose to structopt
use structopt::StructOpt;
#[derive(StructOpt)]
struct Cli {
    #[structopt(short = "o", long = "output")]
    flag: String,
    #[structuopt(parse(from_os_str))]
    path: std::path::PathBuf,
}
let args = Cli::from_args();
let path = &args.path;

Numbers

Print

indicatif progress bar

let pb = indicatif::ProgressBar::new(100);
for i in 0..100 {
        // some thing
        pb.println(format!("[+] finished #{}",i));
        pb.inc(1);
}
pb.finish_with_message("done");

log logging

// error, warn, info, debug, and trace
use log::{info, warn}};
fn main() {
    env_logger::init();
    info!("starting up");
    warn!("warning");
}

Network

ureq HTTP request

fn main() -> Result<(), ureq::Error> {
    let body: String = ureq::get("http://example.com")
        .set("Example-Header", "header value")
        .call()?
        .into_string()?;
    Ok(())
}
  // Requires the `json` feature enabled.
  let resp: String = ureq::post("http://myapi.example.com/ingest")
      .set("X-My-Header", "Secret")
      .send_json(ureq::json!({
          "name": "martin",
          "rust": true
      }))?
      .into_string()?;