sparkle-cache-postgres 0.14.1

Discord cache implementation using PostgresSQL for the Twilight ecosystem
Documentation
use sparkle_cache::model::CachedMember;
use twilight_model::{
    id::Id,
    user::UserFlags,
    util::{ImageHash, Timestamp},
};

use crate::model::premium_type_from_i16;

#[derive(Clone, Debug)]
pub struct QueriedMember {
    pub guild_avatar: Option<String>,
    pub communication_disabled_until: Option<i64>,
    pub deaf: bool,
    pub guild_id: i64,
    pub joined_at: i64,
    pub mute: bool,
    pub nick: Option<String>,
    pub pending: bool,
    pub premium_since: Option<i64>,
    pub accent_color: Option<i64>,
    pub avatar: Option<String>,
    pub banner: Option<String>,
    pub bot: bool,
    pub discriminator: i16,
    pub flags: Option<i64>,
    pub id: i64,
    pub locale: Option<String>,
    pub mfa_enabled: Option<bool>,
    pub name: String,
    pub premium_type: Option<i16>,
    pub public_flags: Option<i64>,
    pub system: Option<bool>,
}

impl From<QueriedMember> for CachedMember {
    fn from(member: QueriedMember) -> Self {
        Self {
            guild_avatar: member
                .guild_avatar
                .map(|avatar| ImageHash::parse(avatar.as_bytes()).unwrap()),
            communication_disabled_until: member
                .communication_disabled_until
                .map(|until| Timestamp::from_secs(until).unwrap()),
            deaf: member.deaf,
            guild_id: Id::new(member.guild_id as u64),
            joined_at: Timestamp::from_secs(member.joined_at).unwrap(),
            mute: member.mute,
            nick: member.nick,
            pending: member.pending,
            premium_since: member
                .premium_since
                .map(|since| Timestamp::from_secs(since).unwrap()),
            accent_color: member.accent_color.map(|color| color as u32),
            avatar: member
                .avatar
                .map(|avatar| ImageHash::parse(avatar.as_bytes()).unwrap()),
            banner: member
                .banner
                .map(|banner| ImageHash::parse(banner.as_bytes()).unwrap()),
            bot: member.bot,
            discriminator: member.discriminator as u16,
            flags: member
                .flags
                .map(|flags| UserFlags::from_bits_truncate(flags as u64)),
            id: Id::new(member.id as u64),
            locale: member.locale,
            mfa_enabled: member.mfa_enabled,
            name: member.name,
            premium_type: member.premium_type.map(premium_type_from_i16),
            public_flags: member
                .public_flags
                .map(|flags| UserFlags::from_bits_truncate(flags as u64)),
            system: member.system,
        }
    }
}