use clap::{App, Arg};
mod http;
mod profile;
use ansi_term::Color::{Blue, Green, Red};
use http::HttpRequest;
use profile::run_profile;
pub fn main() -> anyhow::Result<()> {
let matches = App::new(env!("CARGO_PKG_NAME"))
.arg(
Arg::with_name("url")
.short("u")
.long("url")
.required(true)
.takes_value(true)
.help("The url that the CLI will query"),
)
.arg(
Arg::with_name("profile")
.short("p")
.long("profile")
.takes_value(true)
.help("Runs a profile on the sent request"),
)
.get_matches();
let url = matches
.value_of("url")
.expect("Url is a required argument, and thus must be present");
let url = url::Url::parse(&url)?;
let http_request = HttpRequest::new(&url)?;
if matches.is_present("profile") {
run_profile(http_request, matches.value_of("profile").unwrap())
} else {
let (amount_read, buff, _) = http_request.run()?;
println!("Read {} bytes", Red.paint(amount_read.to_string()));
let split = std::str::from_utf8(&buff)?;
let mut split = split.split_terminator("\r\n\r\n");
if let Some(headers) = split.next() {
println!("Headers: \n{}", Blue.paint(headers));
} else {
anyhow::bail!("No headers available");
}
if let Some(body) = split.next() {
println!("Body: \n{}", Green.paint(body));
} else {
anyhow::bail!("No body available");
}
Ok(())
}
}