beakid 0.3.1

Snowflake-like 64-bit unique ID generator with PostgreSQL BIGINT-friendly i64 IDs.
Documentation
use serde::{Deserialize, Serialize};

const TIMESTAMP_SHIFT: u8 = 22;
const SEQUENCE_SHIFT: u8 = 10;
const TIMESTAMP_MASK: i64 = (1 << 41) - 1;
const SEQUENCE_MASK: i64 = (1 << 12) - 1;
const WORKER_ID_MASK: i64 = (1 << 10) - 1;

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
pub struct BeakId(i64);

impl BeakId {
    pub(crate) fn from_raw(raw: i64) -> Self {
        Self(raw)
    }

    pub fn raw(self) -> i64 {
        self.0
    }

    pub const fn timestamp(self) -> i64 {
        (self.0 >> TIMESTAMP_SHIFT) & TIMESTAMP_MASK
    }

    pub const fn sequence(self) -> u16 {
        ((self.0 >> SEQUENCE_SHIFT) & SEQUENCE_MASK) as u16
    }

    pub const fn worker_id(self) -> u16 {
        (self.0 & WORKER_ID_MASK) as u16
    }
}

impl From<BeakId> for i64 {
    fn from(id: BeakId) -> i64 {
        id.0
    }
}

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