rubx 0.1.1

Rubx (Rust Basic Toolbox) is a library for command programs that features a toolbox with a series of basic functionalities.
Documentation
use reqwest::blocking::Response;
use reqwest::header::HeaderMap;
use reqwest::header::HeaderName;

use std::collections::HashMap;

use crate::rux_debug::{self, dbg_erro, dbg_step};
use crate::RubxError;

pub fn get(url: &str, with_headers: Option<HashMap<String, String>>) -> Result<String, RubxError> {
    dbg_step!(url, with_headers);
    let client = reqwest::blocking::Client::new();
    let builder = client.get(url);
    let mut headers = HeaderMap::new();
    add_headers(&mut headers, with_headers).map_err(|err| dbg_erro!(err))?;
    let resp = builder
        .headers(headers)
        .send()
        .map_err(|err| dbg_erro!(err))?;
    treat_response(&resp).map_err(|err| dbg_erro!(err))?;
    let body = resp.text().map_err(|err| dbg_erro!(err))?;
    Ok(body)
}

pub fn post(
    url: &str,
    text: String,
    with_headers: Option<HashMap<String, String>>,
) -> Result<String, RubxError> {
    dbg_step!(url, text, with_headers);
    let client = reqwest::blocking::Client::new();
    let builder = client.post(url);
    let mut headers = HeaderMap::new();
    add_headers(&mut headers, with_headers).map_err(|err| dbg_erro!(err))?;
    let resp = builder
        .headers(headers)
        .body(text)
        .send()
        .map_err(|err| dbg_erro!(err))?;
    treat_response(&resp).map_err(|err| dbg_erro!(err))?;
    let body = resp.text().map_err(|err| dbg_erro!(err))?;
    Ok(body)
}

pub fn download(
    origin: &str,
    destiny: &str,
    with_headers: Option<HashMap<String, String>>,
) -> Result<(), RubxError> {
    dbg_step!(origin, destiny, with_headers);
    let client = reqwest::blocking::Client::new();
    let builder = client.get(origin);
    let mut headers = HeaderMap::new();
    add_headers(&mut headers, with_headers).map_err(|err| dbg_erro!(err))?;
    let resp = builder
        .headers(headers)
        .send()
        .map_err(|err| dbg_erro!(err))?;
    treat_response(&resp).map_err(|err| dbg_erro!(err))?;
    let mut file = std::fs::File::create(destiny).map_err(|err| dbg_erro!(err))?;
    let mut content = std::io::Cursor::new(resp.bytes().map_err(|err| dbg_erro!(err))?);
    std::io::copy(&mut content, &mut file).map_err(|err| dbg_erro!(err))?;
    Ok(())
}

fn add_headers(to: &mut HeaderMap, from: Option<HashMap<String, String>>) -> Result<(), RubxError> {
    to.insert(
        "User-Agent",
        format!("Rubx (Lua Wizard)/{}", env!("CARGO_PKG_VERSION"))
            .parse()
            .map_err(|err| dbg_erro!(err))?,
    );
    if let Some(from) = from {
        for (key, value) in from {
            if let Ok(name) = HeaderName::from_lowercase(key.as_bytes()) {
                to.insert(name, value.parse().map_err(|err| dbg_erro!(err))?);
            }
        }
    }
    Ok(())
}

fn treat_response(resp: &Response) -> Result<(), RubxError> {
    if !resp.status().is_success() {
        return Err(rux_debug::wrong(format!(
            "Response Error: {}",
            resp.status()
        )));
    }
    Ok(())
}