hur/
lib.rs

1mod cli;
2mod error;
3mod http;
4mod logs;
5mod proxy;
6mod requester;
7
8use cli::output::{handle_output, Output};
9use cli::Input;
10use error::Error;
11use http::request::Request;
12use requester::connector::{Connector, ProxyConnector, RegularConnector};
13use requester::Requester;
14use url::Url;
15
16pub fn process(args: Vec<String>) {
17    match handle_arguments(args) {
18        Ok(()) => {}
19        Err(error) => eprintln!("{}", error),
20    }
21}
22
23fn handle_arguments(args: Vec<String>) -> Result<(), Error> {
24    let (input, output) = cli::parse_args(args)?;
25    handle_input(input, output)
26}
27
28fn handle_input(input: Input, output: Output) -> Result<(), Error> {
29    let allow_proxy = input.allow_proxy;
30    let timeout = input.timeout;
31    let request = setup_request(input)?;
32
33    let connector: Box<dyn Connector> = match (request.proxy, allow_proxy) {
34        (true, true) => Box::new(ProxyConnector::new(timeout)),
35        _ => Box::new(RegularConnector::new(timeout)),
36    };
37
38    let requester = Requester::new(connector);
39
40    let request_output = serde_json::to_value(&request)?;
41    let response = requester.send_request(request)?;
42
43    handle_output(response, request_output, output)
44}
45
46fn setup_request(input: Input) -> Result<Request, Error> {
47    let parsed_url = parse_url(&input.url)?;
48    match input.body {
49        Some(body) => Request::with_body(parsed_url, input.method, input.headers, &body),
50        None => Request::new(parsed_url, input.method, input.headers),
51    }
52}
53
54fn parse_url(url: &str) -> Result<Url, Error> {
55    let parsed_url = match Url::parse(url) {
56        Ok(url) => url,
57        Err(why) => error!(&why.to_string()),
58    };
59    if !parsed_url.has_host() {
60        error!("no host in input");
61    }
62    Ok(parsed_url)
63}