gazelle_api 0.6.0-alpha.1

Gazelle API Client
Documentation
use std::time::Duration;

use reqwest::header::{HeaderMap, HeaderValue};
use reqwest::{header, Client, ClientBuilder};

use crate::{GazelleClient, GazelleClientOptions, RateLimiter};

const DEFAULT_LIMIT: usize = 2;
const DEFAULT_LIMIT_DURATION: Duration = Duration::from_secs(1);

/// Create a [`GazelleClient`]
pub struct GazelleClientFactory {
    pub options: GazelleClientOptions,
}

impl GazelleClientFactory {
    #[must_use]
    pub fn create(self) -> GazelleClient {
        let GazelleClientOptions {
            user_agent,
            key,
            url: base_url,
            requests_allowed_per_duration: num,
            request_limit_duration: per,
        } = self.options;
        let client = create_client(user_agent, key);
        let limiter = RateLimiter::new(
            num.unwrap_or(DEFAULT_LIMIT),
            per.unwrap_or(DEFAULT_LIMIT_DURATION),
        );
        GazelleClient {
            base_url,
            client,
            limiter,
        }
    }
}

fn create_client(user_agent: String, key: String) -> Client {
    ClientBuilder::new()
        .default_headers(get_headers(user_agent, key))
        .build()
        .expect("Client builder should not fail")
}

fn get_headers(user_agent: String, key: String) -> HeaderMap {
    let mut headers = HeaderMap::new();
    headers.insert(
        header::USER_AGENT,
        HeaderValue::try_from(user_agent).expect("user agent should not fail"),
    );
    headers.insert(header::ACCEPT, HeaderValue::from_static("application/json"));
    headers.insert(header::AUTHORIZATION, get_authorization(key));
    headers
}

fn get_authorization(key: String) -> HeaderValue {
    let mut value = HeaderValue::try_from(key).expect("Authorization header should not fail");
    value.set_sensitive(true);
    value
}