twitch_oauth_token 4.2.0

Type-safe Twitch OAuth 2.0 authentication library with CSRF protection and full scope support
Documentation
use asknothingx2_util::api;
use serde::de::DeserializeOwned;
use url::Url;

use crate::{error, Error};

use super::response::{Client, MockData, User};

#[derive(Debug, Clone)]
pub struct MockApiUnits {
    port: u16,
    url: Url,
    client: reqwest::Client,
}

impl MockApiUnits {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn set_port(mut self, port: u16) -> Self {
        self.port = port;
        self.url.set_port(Some(port)).unwrap();
        self
    }

    pub fn set_client(mut self, client: reqwest::Client) -> Self {
        self.client = client;
        self
    }

    pub async fn get_clients(&self) -> Result<MockData<Client>, Error> {
        let mut url = self.url.clone();

        url.path_segments_mut().unwrap().push("clients");

        self.send_json(url).await
    }

    pub async fn get_users(&self) -> Result<MockData<User>, Error> {
        let mut url = self.url.clone();

        url.path_segments_mut().unwrap().push("users");

        self.send_json(url).await
    }

    async fn send_json<T: DeserializeOwned>(&self, url: Url) -> Result<MockData<T>, Error> {
        let resp = self
            .client
            .get(url)
            .send()
            .await
            .map_err(error::network::request)?;

        crate::oauth::decode_response(resp).await
    }
}

impl Default for MockApiUnits {
    fn default() -> Self {
        Self {
            port: 8080,
            url: Url::parse("http://localhost:8080/units").unwrap(),
            client: api::preset::testing("twitch-oauth-test/1.0")
                .build()
                .unwrap(),
        }
    }
}