refluxer 0.2.0

Rust API wrapper for Fluxer
Documentation
use serde::{Deserialize, Serialize};

use crate::error::HttpError;
use crate::http::client::HttpClient;
use crate::http::routing::Route;
use crate::model::channel::Channel;
use crate::model::guild::Guild;
use crate::model::id::{ChannelId, GuildId};
use crate::model::user::User;

#[derive(Debug, Clone, Deserialize)]
pub struct Invite {
    pub code: String,
    #[serde(default)]
    pub guild: Option<Guild>,
    #[serde(default)]
    pub channel: Option<Channel>,
    #[serde(default)]
    pub inviter: Option<User>,
    #[serde(default)]
    pub uses: Option<i32>,
    #[serde(default)]
    pub max_uses: Option<i32>,
    #[serde(default)]
    pub max_age: Option<i32>,
    #[serde(default)]
    pub temporary: Option<bool>,
    #[serde(default)]
    pub created_at: Option<String>,
}

#[derive(Debug, Default, Serialize)]
pub struct CreateInvite {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub max_age: Option<i32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub max_uses: Option<i32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub temporary: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub unique: Option<bool>,
}

impl CreateInvite {
    pub fn new() -> Self {
        Self::default()
    }
    pub fn max_age(mut self, seconds: i32) -> Self {
        self.max_age = Some(seconds);
        self
    }
    pub fn max_uses(mut self, uses: i32) -> Self {
        self.max_uses = Some(uses);
        self
    }
    pub fn temporary(mut self, temporary: bool) -> Self {
        self.temporary = Some(temporary);
        self
    }
    pub fn unique(mut self, unique: bool) -> Self {
        self.unique = Some(unique);
        self
    }
}

impl HttpClient {
    pub async fn get_invite(&self, code: &str) -> Result<Invite, HttpError> {
        self.request_no_body(Route::GetInvite {
            code: code.to_string(),
        })
        .await
    }

    /// Accept an invite, joining the target guild, group DM, or pack.
    /// Returns the raw JSON response because the OpenAPI `oneOf` covers
    /// guild, group-DM and pack invites with different shapes.
    pub async fn accept_invite(&self, code: &str) -> Result<serde_json::Value, HttpError> {
        #[derive(Serialize)]
        struct Body {}

        self.request(
            Route::AcceptInvite {
                code: code.to_string(),
            },
            Some(&Body {}),
        )
        .await
    }

    pub async fn delete_invite(&self, code: &str) -> Result<(), HttpError> {
        self.request_empty(
            Route::DeleteInvite {
                code: code.to_string(),
            },
            None::<&()>,
        )
        .await
    }

    pub async fn get_channel_invites(
        &self,
        channel_id: ChannelId,
    ) -> Result<Vec<Invite>, HttpError> {
        self.request_no_body(Route::GetChannelInvites { channel_id })
            .await
    }

    pub async fn create_channel_invite(
        &self,
        channel_id: ChannelId,
        params: &CreateInvite,
    ) -> Result<Invite, HttpError> {
        self.request(Route::CreateChannelInvite { channel_id }, Some(params))
            .await
    }

    pub async fn get_guild_invites(&self, guild_id: GuildId) -> Result<Vec<Invite>, HttpError> {
        self.request_no_body(Route::GetGuildInvites { guild_id })
            .await
    }
}