discord_client_structs 0.2.0

Discord API/gateway structs with serde support
Documentation
use crate::deserializer::*;
use crate::serializer::*;
use crate::structs::guild::activity::GameActivity;
use crate::structs::user::User;
use chrono::{DateTime, Utc};
use derive_builder::Builder;
use discord_client_macros::CreatedAt;
use serde::{Deserialize, Serialize};

#[derive(Debug, Deserialize, Serialize, Clone, Builder, Default)]
#[builder(setter(into, strip_option), default)]
pub struct Clan {
    #[serde(default)]
    #[serde(deserialize_with = "deserialize_option_string_to_u64")]
    #[serde(serialize_with = "serialize_option_u64_as_string")]
    pub id: Option<u64>,
    #[serde(default)]
    pub name: Option<String>,
    pub tag: Option<String>,
    pub icon_hash: Option<String>,
    pub member_count: Option<u32>,
    pub description: Option<String>,
    pub play_style: Option<u8>,
    pub search_terms: Option<Vec<String>>,
    pub game_application_ids: Option<Vec<u64>>,
    pub badge: Option<String>,
    pub badge_hash: Option<String>,
    pub badge_color_primary: Option<String>,
    pub badge_color_secondary: Option<String>,
    pub banner: Option<u8>,
    pub banner_hash: Option<String>,
    pub brand_color_primary: Option<String>,
    pub brand_color_secondary: Option<String>,
    pub wildcard_descriptors: Option<Vec<String>>,
    pub game_activity: Option<Vec<GameActivity>>,
    pub discovery_profile_features: Option<Vec<String>>,
}

#[derive(Debug, Deserialize, Serialize, Clone, Builder, Default, CreatedAt)]
#[builder(setter(into, strip_option), default)]
pub struct GuildJoinRequest {
    #[serde(deserialize_with = "deserialize_string_to_u64")]
    #[serde(serialize_with = "serialize_u64_as_string")]
    pub id: u64,
    #[serde(deserialize_with = "deserialize_string_to_u64")]
    #[serde(serialize_with = "serialize_u64_as_string")]
    pub join_request_id: u64,
    #[serde(deserialize_with = "deserialize_iso8601_string_to_date")]
    #[serde(serialize_with = "serialize_date_to_iso8601_string")]
    pub created_at: DateTime<Utc>,
    pub application_status: String,
    #[serde(deserialize_with = "deserialize_string_to_u64")]
    #[serde(serialize_with = "serialize_u64_as_string")]
    pub guild_id: u64,
    #[serde(default)]
    pub form_responses: Option<Vec<MemberVerificationFormField>>,
    #[serde(default)]
    #[serde(deserialize_with = "deserialize_option_iso8601_string_to_date")]
    #[serde(serialize_with = "serialize_option_date_to_iso8601_string")]
    pub last_seen: Option<DateTime<Utc>>,
    #[serde(default)]
    #[serde(deserialize_with = "deserialize_option_string_to_u64")]
    #[serde(serialize_with = "serialize_option_u64_as_string")]
    pub actioned_at: Option<u64>,
    #[serde(default)]
    pub actioned_by_user: Option<User>,
    #[serde(default)]
    pub rejection_reason: Option<String>,
    #[serde(deserialize_with = "deserialize_string_to_u64")]
    #[serde(serialize_with = "serialize_u64_as_string")]
    pub user_id: u64,
    #[serde(default)]
    pub user: Option<User>,
    #[serde(default)]
    #[serde(deserialize_with = "deserialize_option_string_to_u64")]
    #[serde(serialize_with = "serialize_option_u64_as_string")]
    pub interview_channel_id: Option<u64>,
}

#[derive(Debug, Deserialize, Serialize, Clone, Builder, Default)]
#[builder(setter(into, strip_option), default)]
pub struct MemberVerificationFormField {
    pub field_type: String,
    pub label: String,
    #[serde(default)]
    pub choices: Option<Vec<String>>,
    #[serde(default)]
    pub values: Option<Vec<String>>,
    #[serde(default)]
    pub response: Option<serde_json::Value>,
    pub required: bool,
    #[serde(default)]
    pub description: Option<String>,
    #[serde(default)]
    pub automations: Option<Vec<String>>,
    #[serde(default)]
    pub placeholder: Option<String>,
}

#[derive(Debug, Deserialize, Serialize, Clone, Builder, Default)]
#[builder(setter(into, strip_option), default)]
pub struct ClanBadge {
    pub tag: Option<String>,
    #[serde(deserialize_with = "deserialize_option_string_to_u64")]
    #[serde(serialize_with = "serialize_option_u64_as_string")]
    pub identity_guild_id: Option<u64>,
    pub identity_enabled: Option<bool>,
    pub badge: Option<String>,
}

impl ClanBadge {
    pub fn get_image_url(&self, custom_size: Option<u16>) -> Option<String> {
        if self.badge.is_none() || self.identity_guild_id.is_none() {
            return None;
        }

        if let Some(size) = custom_size {
            Some(format!(
                "https://cdn.discordapp.com/clan-badges/{}/{}.png?size={}",
                self.identity_guild_id.unwrap(),
                self.clone().badge.unwrap(),
                size
            ))
        } else {
            Some(format!(
                "https://cdn.discordapp.com/clan-badges/{}/{}.png",
                self.identity_guild_id.unwrap(),
                self.clone().badge.unwrap()
            ))
        }
    }
}