discrab 0.5.0

A simple Discord bot wrapper
use bitflags::bitflags;
use serde::{Deserialize, Deserializer, Serialize};

bitflags! {
    #[derive(Serialize)]
    pub struct Permissions: u64 {
        const CREATE_INSTANT_INVITE = (1 << 0);
        const KICK_MEMBERS = (1 << 1);
        const BAN_MEMBERS = (1 << 2);
        const ADMINISTRATOR = (1 << 3);
        const MANAGE_CHANNELS = (1 << 4);
        const MANAGE_GUILD = (1 << 5);
        const ADD_REACTIONS = (1 << 6);
        const VIEW_AUDIT_LOG = (1 << 7);
        const PRIORITY_SPEAKER = (1 << 8);
        const STREAM = (1 << 9);
        const VIEW_CHANNEL = (1 << 10);
        const SEND_MESSAGES = (1 << 11);
        const SEND_TTS_MESSAGES = (1 << 12);
        const MANAGE_MESSAGES = (1 << 13);
        const EMBED_LINKS = (1 << 14);
        const ATTACH_FILES = (1 << 15);
        const READ_MESSAGE_HISTORY = (1 << 16);
        const MENTION_EVERYONE = (1 << 17);
        const USE_EXTERNAL_EMOJIS = (1 << 18);
        const VIEW_GUILD_INSIGHTS = (1 << 19);
        const CONNECT = (1 << 20);
        const SPEAK = (1 << 21);
        const MUTE_MEMBERS = (1 << 22);
        const DEAFEN_MEMBERS = (1 << 23);
        const MOVE_MEMBERS = (1 << 24);
        const USE_VAD = (1 << 25);
        const CHANGE_NICKNAME = (1 << 26);
        const MANAGE_NICKNAMES = (1 << 27);
        const MANAGE_ROLES = (1 << 28);
        const MANAGE_WEBHOOKS = (1 << 29);
        const MANAGE_EMOJIS_AND_STICKERS = (1 << 30);
        const USE_APPLICATION_COMMANDS = (1 << 31);
        const REQUEST_TO_SPEAK = (1 << 32);
        const MANAGE_THREADS = (1 << 34);
        const CREATE_PUBLIC_THREADS = (1 << 35);
        const CREATE_PRIVATE_THREADS = (1 << 36);
        const USE_EXTERNAL_STICKERS = (1 << 37);
        const SEND_MESSAGES_IN_THREADS = (1 << 38);
        const START_EMBEDDED_ACTIVITIES = (1 << 39);
    }
}

impl<'de> Deserialize<'de> for Permissions {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let bits = u64::deserialize(deserializer)?;

        Permissions::from_bits(bits)
            .ok_or_else(|| serde::de::Error::custom(format!("Unexpected flags value {}", bits)))
    }
}