kodumaro-http-cli 0.5.5

Kodumaro HTTP CLI inspired by HTTPie
Documentation
use reqwest::header::{HeaderName, HeaderValue};
use reqwest::redirect::Policy;
use reqwest::{Method, Request, Url};

use super::payload::Payload;
use super::verb::Verb;

#[derive(Debug)]
pub struct HttpRequest {

    pub verb: Verb,
    pub url: Url,
    pub payload: Payload,
    pub headers: Vec<(HeaderName, HeaderValue)>,
    pub output: Option<String>,
    pub follow: bool,
    pub max_redirects: usize,
    pub verify: bool,
    pub fail: bool,
    pub verbose: bool,
    pub dry_run: bool,
}

impl Default for HttpRequest {

    fn default() -> Self {
        Self {
            verb: Verb::GET,
            url: "http://localhost/".try_into()
                .expect("parsing localhost shouldn’t crash"),
            payload: Payload::NoContent,
            headers: Vec::new(),
            output: None,
            follow: false,
            max_redirects: 0,
            verify: false,
            fail: false,
            verbose: false,
            dry_run: false,
        }
    }
}

impl From<&HttpRequest> for Request {

    fn from(request: &HttpRequest) -> Self {
        let method: Method = request.verb.into();
        let mut res = Request::new(method, request.url.clone());
        for (name, content) in &request.headers {
            let _ = res.headers_mut().insert(name.to_owned(), content.to_owned());
        }
        res
    }
}

impl From<&HttpRequest> for Policy {

    fn from(request: &HttpRequest) -> Self {
        if request.follow {
            Policy::limited(request.max_redirects)
        } else {
            Policy::none()
        }
    }
}