twitch_highway 0.5.2

Twitch API
Documentation
use crate::{
    Client, Error,
    search::{CategoriesResponse, ChannelsResponse},
    types::constants::{AFTER, CATEGORIES, CHANNELS, FIRST, QUERY, SEARCH},
};

const LIVE_ONLY: &str = "live_only";

#[derive(Debug)]
pub struct SearchCategories<'a> {
    client: &'a Client,
    query: &'a str,
    first: Option<u8>,
    after: Option<&'a str>,
}

impl<'a> SearchCategories<'a> {
    pub fn new(client: &'a Client, query: &'a str) -> Self {
        Self {
            client,
            query,
            first: None,
            after: None,
        }
    }

    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<CategoriesResponse, Error> {
        let mut url = self.client.base_url();

        url.path_segments_mut()
            .unwrap()
            .extend([SEARCH, CATEGORIES]);

        url.query_pairs_mut().append_pair(QUERY, self.query);
        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
    }
}

#[derive(Debug)]
pub struct SearchChannels<'a> {
    client: &'a Client,
    query: &'a str,
    live_only: Option<bool>,
    first: Option<u8>,
    after: Option<&'a str>,
}

impl<'a> SearchChannels<'a> {
    pub fn new(client: &'a Client, query: &'a str) -> Self {
        Self {
            client,
            query,
            live_only: None,
            first: None,
            after: None,
        }
    }

    pub fn live_only(mut self, value: bool) -> Self {
        self.live_only = 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<ChannelsResponse, Error> {
        let mut url = self.client.base_url();

        url.path_segments_mut().unwrap().extend([SEARCH, CHANNELS]);

        url.query_pairs_mut().append_pair(QUERY, self.query);
        if let Some(val) = self.live_only {
            url.query_pairs_mut()
                .append_pair(LIVE_ONLY, &val.to_string());
        }
        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
    }
}