Useful Crates
Testing
assert_cmd
- Test the program that lives in the current crate
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
// 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
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()?;