use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
)]
pub struct DatabaseId(u64);
impl DatabaseId {
pub const DEFAULT: DatabaseId = DatabaseId(0);
pub const fn new(id: u64) -> Self {
Self(id)
}
pub const fn as_u64(self) -> u64 {
self.0
}
}
impl Default for DatabaseId {
fn default() -> Self {
Self::DEFAULT
}
}
impl From<u64> for DatabaseId {
fn from(id: u64) -> Self {
Self(id)
}
}
impl fmt::Display for DatabaseId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "db:{}", self.0)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn database_id_display() {
let d = DatabaseId::new(42);
assert_eq!(d.to_string(), "db:42");
assert_eq!(d.as_u64(), 42);
}
#[test]
fn database_id_above_u32_max_roundtrip() {
let large = u32::MAX as u64 + 1;
let d = DatabaseId::new(large);
assert_eq!(d.as_u64(), large);
assert_eq!(d.to_string(), format!("db:{large}"));
}
#[test]
fn database_id_from_u64() {
let d: DatabaseId = DatabaseId::from(4_294_967_296u64);
assert_eq!(d.as_u64(), 4_294_967_296u64);
}
#[test]
fn default_constant_is_zero() {
assert_eq!(DatabaseId::DEFAULT.as_u64(), 0);
assert_eq!(DatabaseId::DEFAULT.to_string(), "db:0");
}
#[test]
fn serde_roundtrip() {
let did = DatabaseId::new(7);
let json = sonic_rs::to_string(&did).unwrap();
let decoded: DatabaseId = sonic_rs::from_str(&json).unwrap();
assert_eq!(did, decoded);
}
#[test]
fn serde_roundtrip_above_u32_max() {
let did = DatabaseId::new(u32::MAX as u64 + 1);
let json = sonic_rs::to_string(&did).unwrap();
let decoded: DatabaseId = sonic_rs::from_str(&json).unwrap();
assert_eq!(did, decoded);
}
}