#![doc = include_str!("../Readme.md")]
use std::marker::PhantomData;
use rand::prelude::*;
mod common_traits;
mod conversions;
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Id<Label, const SIZE: usize = 16> {
#[cfg_attr(feature = "serde", serde(with = "serde_arrays"))]
data: [u8; SIZE],
_phantom: PhantomData<Label>,
}
unsafe impl<Label, const SIZE: usize> Send for Id<Label, SIZE> {}
unsafe impl<Label, const SIZE: usize> Sync for Id<Label, SIZE> {}
impl<Label, const SIZE: usize> Id<Label, SIZE> {
pub fn new_random() -> Self {
let mut rng = rand::thread_rng();
let mut data = [0; SIZE];
rng.fill(data.as_mut_slice());
Self {
data,
_phantom: PhantomData,
}
}
pub fn as_bytes(&self) -> &[u8; SIZE] {
&self.data
}
pub fn cast_label<NewLabel>(self) -> Id<NewLabel, SIZE> {
Id {
data: self.data,
_phantom: PhantomData,
}
}
}