discrab 0.5.0

A simple Discord bot wrapper
use std::fmt::{Debug, Display};

use bitfield::bitfield;
use serde::{de, Deserialize, Deserializer, Serialize};

bitfield! {
    #[derive(Serialize, Clone, PartialEq, Eq, Hash, Copy)]
    pub struct Snowflake(u64);
    pub timestamp, _: 63, 22;
    pub worker_id, _: 21, 17;
    pub process_id, _: 16, 12;
    pub increment, _: 11, 0;
}

impl Display for Snowflake {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "{}", self.0)
    }
}

impl Debug for Snowflake {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.debug_tuple("Snowflake").field(&self.0).finish()
    }
}

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

        match s.parse() {
            Ok(sf) => Ok(Snowflake(sf)),
            Err(_) => Err(de::Error::custom("invalid snowflake")),
        }
    }
}