twitch_highway 0.5.2

Twitch API
Documentation
use crate::{
    Client, Error,
    types::{
        BroadcasterId, UserId,
        constants::{
            AFTER, BLOCKS, BROADCASTER_ID, EXTENSIONS, FIRST, ID, LOGIN, REASON, SOURCE_CONTEXT,
            TARGET_USER_ID, USER_ID, USERS,
        },
    },
    users::{
        BlockReason, BlockSourceContext, BlockUserListResponse, Component, Overlay, Panel,
        UserActiveExtensions, UserActiveExtensionsResponse, UsersInfoResponse,
    },
};

#[derive(Debug)]
pub struct GetUsers<'a> {
    client: &'a Client,
    ids: Option<&'a [UserId]>,
    logins: Option<&'a [&'a str]>,
}

impl<'a> GetUsers<'a> {
    pub fn new(client: &'a Client) -> Self {
        Self {
            client,
            ids: None,
            logins: None,
        }
    }

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

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

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

        url.path_segments_mut().unwrap().push(USERS);

        if let Some(ids) = self.ids {
            url.query_pairs_mut()
                .extend_pairs(ids.iter().map(|id| (ID, id)));
        }

        if let Some(logins) = self.logins {
            url.query_pairs_mut()
                .extend_pairs(logins.iter().map(|login| (LOGIN, login)));
        }

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

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

impl<'a> GetUserBlockList<'a> {
    pub fn new(client: &'a Client, broadcaster_id: &'a BroadcasterId) -> Self {
        Self {
            client,
            broadcaster_id,
            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<BlockUserListResponse, Error> {
        let mut url = self.client.base_url();

        url.path_segments_mut().unwrap().extend([USERS, BLOCKS]);

        url.query_pairs_mut()
            .append_pair(BROADCASTER_ID, self.broadcaster_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
    }
}

#[derive(Debug)]
pub struct CreateBlockUser<'a> {
    client: &'a Client,
    target_user_id: &'a UserId,
    source_context: Option<BlockSourceContext>,
    reason: Option<BlockReason>,
}

impl<'a> CreateBlockUser<'a> {
    pub fn new(client: &'a Client, target_user_id: &'a UserId) -> Self {
        Self {
            client,
            target_user_id,
            source_context: None,
            reason: None,
        }
    }

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

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

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

        url.path_segments_mut().unwrap().extend([USERS, BLOCKS]);

        url.query_pairs_mut()
            .append_pair(TARGET_USER_ID, self.target_user_id.as_ref());

        if let Some(val) = self.source_context {
            url.query_pairs_mut()
                .append_pair(SOURCE_CONTEXT, val.as_ref());
        }

        if let Some(val) = self.reason {
            url.query_pairs_mut().append_pair(REASON, val.as_ref());
        }

        let req = self.client.http_client().put(url);
        self.client.no_content(req).await
    }
}

#[derive(Debug)]
pub struct GetUserActiveExtensions<'a> {
    client: &'a Client,
    user_id: Option<&'a UserId>,
}

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

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

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

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

        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 UpdateUserExtensions<'a> {
    client: &'a Client,
    data: UserActiveExtensions,
}

impl<'a> UpdateUserExtensions<'a> {
    pub fn new(client: &'a Client) -> Self {
        Self {
            client,
            data: UserActiveExtensions::new(),
        }
    }

    pub fn add_panel(mut self, panel: Panel) -> Self {
        self.data = self.data.add_panel(panel);
        self
    }

    pub fn add_panels(mut self, panels: Vec<Panel>) -> Self {
        self.data = self.data.add_panels(panels);
        self
    }

    pub fn add_overlay(mut self, overlay: Overlay) -> Self {
        self.data = self.data.add_overlay(overlay);
        self
    }

    pub fn add_component(mut self, component: Component) -> Self {
        self.data = self.data.add_component(component);
        self
    }

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

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

        let req = self.client.http_client().put(url).json(&self.data);
        self.client.json(req).await
    }
}