silver_surf 0.1.4

A wrapper arround surf
Documentation
use crate::Config;

pub struct Answer {
    req: surf::Request<http_client::isahc::IsahcClient>,
}
impl Answer {
    fn new(req: surf::Request<http_client::isahc::IsahcClient>) -> Self {
        Self { req }
    }
    pub async fn json<T: serde::de::DeserializeOwned>(
        self,
    ) -> Result<T, Box<dyn std::error::Error + Send + Sync + 'static>> {
        let v = self.req.recv_string().await?;
        let v = serde_json::from_str(&v)?;
        Ok(v)
    }
    pub async fn bytes(
        self,
    ) -> Result<Vec<u8>, Box<dyn std::error::Error + Send + Sync + 'static>> {
        let v = self.req.recv_bytes().await?;
        Ok(v)
    }
}

pub fn call<I: serde::Serialize>(conf: Config<I>) -> Result<Answer, crate::Error> {
    let client = surf::Client::new();
    let client = {
        use crate::Method::*;
        match conf.method {
            Post => client.post(conf.url),
            Put => client.put(conf.url),
            Get => client.get(conf.url),
            Delete => client.delete(conf.url),
        }
    };
    let mut client = if let Some(body) = conf.body {
        let val = serde_json::to_string(&body).unwrap();

        let len = val.len();
        client
            .body_string(val)
            .set_header("Content-Length".parse().unwrap(), len.to_string())
            .set_header("Content-Type".parse().unwrap(), "application/json")
    } else {
        client
    };
    if let Some(headers) = conf.headers {
        for (key, value) in headers {
            let key = dbg!(key);
            let value = dbg!(value);
            let checked_key = key.parse();

            client = match checked_key {
                Ok(key) => client.set_header(key, value),
                Err(_) => return Err(crate::Error::BadHeader(key)),
            }
        }
    }
    Ok(Answer::new(client))
}