refluxer 0.1.0

Rust API wrapper for Fluxer
Documentation
use crate::error::HttpError;
use crate::http::client::HttpClient;
use crate::http::routing::Route;
use crate::model::channel::Channel;
use crate::model::id::{ChannelId, UserId};
use crate::model::permissions::Permissions;

impl HttpClient {
    pub async fn get_channel(&self, channel_id: ChannelId) -> Result<Channel, HttpError> {
        self.request_no_body(Route::GetChannel { channel_id }).await
    }
    pub async fn modify_channel(
        &self,
        channel_id: ChannelId,
        params: &ModifyChannel,
    ) -> Result<Channel, HttpError> {
        self.request(Route::ModifyChannel { channel_id }, Some(params))
            .await
    }
    pub async fn delete_channel(&self, channel_id: ChannelId) -> Result<(), HttpError> {
        self.request_empty(Route::DeleteChannel { channel_id }, None::<&()>)
            .await
    }

    /// Trigger a typing indicator in a channel.
    pub async fn trigger_typing(&self, channel_id: ChannelId) -> Result<(), HttpError> {
        #[derive(serde::Serialize)]
        struct Body {}

        self.request_empty(Route::TriggerTyping { channel_id }, Some(&Body {}))
            .await
    }

    /// Create or replace a permission overwrite on a channel. `overwrite_id`
    /// is the role or member snowflake the overwrite applies to, and
    /// `params.kind` tells the server whether it is a role or a member.
    pub async fn set_channel_permission_overwrite(
        &self,
        channel_id: ChannelId,
        overwrite_id: impl Into<String>,
        params: &PermissionOverwriteRequest,
    ) -> Result<(), HttpError> {
        self.request_empty(
            Route::SetChannelPermissionOverwrite {
                channel_id,
                overwrite_id: overwrite_id.into(),
            },
            Some(params),
        )
        .await
    }

    /// Remove a permission overwrite.
    pub async fn delete_channel_permission_overwrite(
        &self,
        channel_id: ChannelId,
        overwrite_id: impl Into<String>,
    ) -> Result<(), HttpError> {
        self.request_empty(
            Route::DeleteChannelPermissionOverwrite {
                channel_id,
                overwrite_id: overwrite_id.into(),
            },
            None::<&()>,
        )
        .await
    }

    /// Add a user to a group DM.
    pub async fn add_group_dm_recipient(
        &self,
        channel_id: ChannelId,
        user_id: UserId,
    ) -> Result<(), HttpError> {
        #[derive(serde::Serialize)]
        struct Body {}

        self.request_empty(
            Route::AddGroupDmRecipient {
                channel_id,
                user_id,
            },
            Some(&Body {}),
        )
        .await
    }

    /// Remove a user from a group DM.
    pub async fn remove_group_dm_recipient(
        &self,
        channel_id: ChannelId,
        user_id: UserId,
    ) -> Result<(), HttpError> {
        self.request_empty(
            Route::RemoveGroupDmRecipient {
                channel_id,
                user_id,
            },
            None::<&()>,
        )
        .await
    }
}

#[derive(Debug, Clone, Copy, serde_repr::Serialize_repr)]
#[repr(u8)]
pub enum PermissionOverwriteType {
    Role = 0,
    Member = 1,
}

#[derive(Debug, serde::Serialize)]
pub struct PermissionOverwriteRequest {
    #[serde(rename = "type")]
    pub kind: PermissionOverwriteType,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub allow: Option<Permissions>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub deny: Option<Permissions>,
}

#[derive(Debug, Default, serde::Serialize)]
pub struct ModifyChannel {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub topic: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub nsfw: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub rate_limit_per_user: Option<i32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub position: Option<i32>,
}