provable-sdk 0.1.2

Provable SDK for Rust
Documentation
use crate::config::resolve_api_key;
use crate::error::{ProvableError, Result};
use reqwest::blocking::{Client, Response};
use reqwest::header::{HeaderMap, HeaderValue, CONTENT_TYPE};
use serde::de::DeserializeOwned;
use serde::Serialize;

fn client() -> Client {
    Client::builder().build().expect("reqwest client")
}

fn headers(api_key: Option<&str>) -> Result<HeaderMap> {
    let mut headers = HeaderMap::new();
    headers.insert(CONTENT_TYPE, HeaderValue::from_static("application/json"));
    headers.insert(
        "X-User-Key",
        HeaderValue::from_str(&resolve_api_key(api_key))
            .map_err(|error| ProvableError::new(error.to_string()))?,
    );
    Ok(headers)
}

fn handle_response<T: DeserializeOwned>(response: Response) -> Result<T> {
    if !response.status().is_success() {
        let status = response.status();
        let body = response.text().unwrap_or_default();
        return Err(ProvableError::new(format!(
            "API error: {} {}",
            status, body
        )));
    }
    Ok(response.json::<T>()?)
}

pub fn get_json<T: DeserializeOwned>(url: &str, api_key: Option<&str>) -> Result<T> {
    let response = client().get(url).headers(headers(api_key)?).send()?;
    handle_response(response)
}

pub fn post_json<B: Serialize, T: DeserializeOwned>(
    url: &str,
    body: &B,
    api_key: Option<&str>,
) -> Result<T> {
    let response = client()
        .post(url)
        .headers(headers(api_key)?)
        .json(body)
        .send()?;
    handle_response(response)
}