f1 0.2.0

Get historical and live Formula 1 (F1) data
Documentation
use crate::F1Error;
use lazy_static::lazy_static;
use std::collections::HashMap;
use std::sync::Mutex;

const BASE_URL: &str = "https://ergast.com/api/f1";

lazy_static! {
    static ref CACHE: Mutex<HashMap<String, serde_json::Value>> = Mutex::new(HashMap::new());
}

pub fn get(url: String) -> Result<serde_json::Value, F1Error> {
    if CACHE.lock().map_err(|_| F1Error::Cache)?.contains_key(&url) {
        return Ok(CACHE.lock().map_err(|_| F1Error::Cache)?[&url].clone());
    }

    let r = reqwest::blocking::get(format!("{}/{}.json", BASE_URL, url))
        .map_err(|_| F1Error::ApiNotReachable)?;

    let v: serde_json::Value = r.json().map_err(|_| F1Error::JsonDeserialization)?;

    CACHE
        .lock()
        .map_err(|_| F1Error::Cache)?
        .insert(url, v["MRData"].clone());

    Ok(v["MRData"].clone())
}