sparkle-cache-postgres 0.14.1

Discord cache implementation using PostgresSQL for the Twilight ecosystem
Documentation
use sparkle_cache::model::CachedGuild;
use twilight_model::{
    guild::{
        DefaultMessageNotificationLevel, ExplicitContentFilter, MfaLevel, NSFWLevel, Permissions,
        PremiumTier, SystemChannelFlags, VerificationLevel,
    },
    id::Id,
    util::{ImageHash, Timestamp},
};

#[derive(Clone, Debug)]
pub struct QueriedGuild {
    pub afk_channel_id: Option<i64>,
    pub afk_timeout: i64,
    pub application_id: Option<i64>,
    pub banner: Option<String>,
    pub default_message_notifications: i16,
    pub description: Option<String>,
    pub discovery_splash: Option<String>,
    pub explicit_content_filter: i16,
    pub features: String,
    pub icon: Option<String>,
    pub id: i64,
    pub joined_at: Option<i64>,
    pub large: bool,
    pub max_members: Option<i64>,
    pub max_presences: Option<i64>,
    pub max_video_channel_users: Option<i64>,
    pub mfa_level: i16,
    pub name: String,
    pub nsfw_level: i16,
    pub owner_id: i64,
    pub owner: Option<bool>,
    pub permissions: Option<i64>,
    pub preferred_locale: String,
    pub premium_progress_bar_enabled: bool,
    pub premium_subscription_count: Option<i64>,
    pub premium_tier: i16,
    pub rules_channel_id: Option<i64>,
    pub splash: Option<String>,
    pub system_channel_flags: i64,
    pub system_channel_id: Option<i64>,
    pub unavailable: bool,
    pub vanity_url_code: Option<String>,
    pub verification_level: i16,
    pub widget_channel_id: Option<i64>,
    pub widget_enabled: Option<bool>,
}

impl From<QueriedGuild> for CachedGuild {
    fn from(guild: QueriedGuild) -> Self {
        Self {
            afk_channel_id: guild.afk_channel_id.map(|id| Id::new(id as u64)),
            afk_timeout: guild.afk_timeout as u64,
            application_id: guild.application_id.map(|id| Id::new(id as u64)),
            banner: guild
                .banner
                .map(|banner| ImageHash::parse(banner.as_bytes()).unwrap()),
            default_message_notifications: DefaultMessageNotificationLevel::from(
                guild.default_message_notifications as u8,
            ),
            description: guild.description,
            discovery_splash: guild
                .discovery_splash
                .map(|splash| ImageHash::parse(splash.as_bytes()).unwrap()),
            explicit_content_filter: ExplicitContentFilter::from(
                guild.explicit_content_filter as u8,
            ),
            features: guild
                .features
                .split(' ')
                .map(|feature| feature.to_owned().into())
                .collect(),
            icon: guild
                .icon
                .map(|icon| ImageHash::parse(icon.as_bytes()).unwrap()),
            id: Id::new(guild.id as u64),
            joined_at: guild
                .joined_at
                .map(|joined| Timestamp::from_secs(joined).unwrap()),
            large: guild.large,
            max_members: guild.max_members.map(|max| max as u64),
            max_presences: guild.max_presences.map(|max| max as u64),
            max_video_channel_users: guild.max_video_channel_users.map(|max| max as u64),
            mfa_level: MfaLevel::from(guild.mfa_level as u8),
            name: guild.name,
            nsfw_level: NSFWLevel::from(guild.nsfw_level as u8),
            owner_id: Id::new(guild.owner_id as u64),
            owner: guild.owner,
            permissions: guild
                .permissions
                .map(|flags| Permissions::from_bits_truncate(flags as u64)),
            preferred_locale: guild.preferred_locale,
            premium_progress_bar_enabled: guild.premium_progress_bar_enabled,
            premium_subscription_count: guild.premium_subscription_count.map(|count| count as u64),
            premium_tier: PremiumTier::from(guild.premium_tier as u8),
            rules_channel_id: guild.rules_channel_id.map(|id| Id::new(id as u64)),
            splash: guild
                .splash
                .map(|splash| ImageHash::parse(splash.as_bytes()).unwrap()),
            system_channel_flags: SystemChannelFlags::from_bits_truncate(
                guild.system_channel_flags as u64,
            ),
            system_channel_id: guild.system_channel_id.map(|id| Id::new(id as u64)),
            unavailable: guild.unavailable,
            vanity_url_code: guild.vanity_url_code,
            verification_level: VerificationLevel::from(guild.verification_level as u8),
            widget_channel_id: guild.widget_channel_id.map(|id| Id::new(id as u64)),
            widget_enabled: guild.widget_enabled,
        }
    }
}