twitch_highway 0.5.2

Twitch API
Documentation
use chrono::{DateTime, Utc};

use crate::{
    Client, Error,
    bits::{BitsLeaderboardResponse, ExtensionTransactionsResponse},
    types::{
        ExtensionId, TransactionId, UserId,
        constants::{
            AFTER, BITS, COUNT, EXTENSION_ID, EXTENSIONS, FIRST, ID, LEADERBOARD, PERIOD,
            STARTED_AT, TRANSACTIONS, USER_ID,
        },
    },
};

use crate::bits::Period;

#[derive(Debug)]
pub struct GetBitsLeaderboard<'a> {
    client: &'a Client,
    count: Option<u8>,
    period: Option<Period>,
    started_at: Option<&'a DateTime<Utc>>,
    user_id: Option<&'a UserId>,
}

impl<'a> GetBitsLeaderboard<'a> {
    pub fn new(client: &'a Client) -> Self {
        Self {
            client,
            count: None,
            period: None,
            started_at: None,
            user_id: None,
        }
    }

    /// min 1, max 100, default 10
    pub fn count(mut self, value: u8) -> Self {
        self.count = Some(value);
        self
    }

    pub fn period(mut self, value: Period) -> Self {
        self.period = Some(value);
        self
    }

    pub fn started_at(mut self, value: &'a DateTime<Utc>) -> Self {
        self.started_at = Some(value);
        self
    }

    pub fn user_id(mut self, value: &'a UserId) -> Self {
        self.user_id = Some(value);
        self
    }

    pub async fn send(self) -> Result<BitsLeaderboardResponse, Error> {
        let mut url = self.client.base_url();

        url.path_segments_mut().unwrap().extend([BITS, LEADERBOARD]);

        if let Some(val) = self.count {
            url.query_pairs_mut().append_pair(COUNT, &val.to_string());
        }
        if let Some(val) = self.period {
            url.query_pairs_mut().append_pair(PERIOD, val.as_ref());
        }
        if let Some(val) = self.started_at {
            url.query_pairs_mut().append_pair(
                STARTED_AT,
                &val.to_rfc3339_opts(chrono::SecondsFormat::Secs, true),
            );
        }
        if let Some(val) = self.user_id {
            url.query_pairs_mut().append_pair(USER_ID, val);
        }

        let req = self.client.http_client().get(url);
        self.client.json(req).await
    }
}

#[derive(Debug)]
pub struct GetExtensionTransactions<'a> {
    client: &'a Client,
    extension_id: &'a ExtensionId,
    ids: Option<&'a [TransactionId]>,
    first: Option<u8>,
    after: Option<&'a str>,
}

impl<'a> GetExtensionTransactions<'a> {
    pub fn new(client: &'a Client, extension_id: &'a ExtensionId) -> Self {
        Self {
            client,
            extension_id,
            ids: None,
            first: None,
            after: None,
        }
    }

    pub fn ids(mut self, value: &'a [TransactionId]) -> Self {
        self.ids = Some(value);
        self
    }

    pub fn first(mut self, value: u8) -> Self {
        self.first = Some(value);
        self
    }

    pub fn after(mut self, value: &'a str) -> Self {
        self.after = Some(value);
        self
    }

    pub async fn send(self) -> Result<ExtensionTransactionsResponse, Error> {
        let mut url = self.client.base_url();

        url.path_segments_mut()
            .unwrap()
            .extend([EXTENSIONS, TRANSACTIONS]);

        url.query_pairs_mut()
            .append_pair(EXTENSION_ID, self.extension_id.as_ref());
        if let Some(ids) = self.ids {
            url.query_pairs_mut()
                .extend_pairs(ids.iter().map(|id| (ID, id)));
        }
        if let Some(val) = self.first {
            url.query_pairs_mut().append_pair(FIRST, &val.to_string());
        }
        if let Some(val) = self.after {
            url.query_pairs_mut().append_pair(AFTER, val);
        }

        let req = self.client.http_client().get(url);
        self.client.json(req).await
    }
}