uuid-rs/src/lib.rs

102 lines
2.0 KiB
Rust
Raw Normal View History

2023-09-04 22:00:00 -04:00
pub mod v4;
mod rng;
pub(crate) type Bytes = [u8; 16];
pub struct Uuid(Bytes);
#[derive(Clone, Copy, Debug, PartialEq)]
#[repr(u8)]
pub enum Variant {
NCS = 0u8,
Default = 0x80,
Microsoft = 0xc0,
Future = 0xe0,
}
#[derive(Clone, Copy, Debug, PartialEq)]
#[repr(u8)]
pub enum Version {
Nil = 0,
Time = 1,
DCE = 2,
MD5 = 3,
Random = 4,
SHA1 = 5,
Unknown = u8::MAX
}
impl Uuid {
pub fn new(version: Version) -> Self {
match version {
Version::Nil => Self::new_nil(),
Version::Random => Self::new_random(),
_ => panic!("Unsupported UUID version: {:?}", version)
}
}
pub fn new_nil() -> Self {
Uuid(Uuid::nil_bytes())
}
#[inline]
pub const fn as_bytes(&self) -> &[u8] {
&self.0
}
pub const fn get_variant(&self) -> Variant {
match self.as_bytes()[8] {
x if x & 0x80 == 0 => Variant::NCS,
x if x & 0x40 == 0 => Variant::Default,
x if x & 0x20 == 0 => Variant::Microsoft,
_ => Variant::Future
}
}
pub const fn get_version_num(&self) -> u8 {
self.as_bytes()[6] >> 4
}
pub const fn get_version(&self) -> Version {
match self.get_version_num() {
0 => Version::Nil,
1 => Version::Time,
2 => Version::DCE,
3 => Version::MD5,
4 => Version::Random,
5 => Version::SHA1,
_ => Version::Unknown
}
}
#[inline]
const fn nil_bytes() -> Bytes {
[0u8; 16]
}
#[inline]
fn set_variant(bytes: &mut Bytes, variant: Variant) {
let variant = variant as u8;
let byte = bytes[8] & 0xf;
bytes[8] = variant & byte;
}
#[inline]
fn set_version(bytes: &mut Bytes, version: Version) {
bytes[6] |= (version as u8) << 4;
}
}
impl Default for Uuid {
fn default() -> Self {
Uuid::new_nil()
}
}
// impl AsRef<Bytes> for Uuid {
// fn as_ref(&self) -> &Bytes {
// &self.0
// }
// }