use super::*;
use libc;
pub enum Domain {
Person = 0,
Group = 1,
Org = 2,
}
impl Uuid {
pub fn new_v2(uuid: &Uuid, domain: Domain, id: u32) -> Self {
assert_eq!(uuid.version(), Version(1));
let mut bs = uuid.as_bytes();
bs[6] = (bs[6] & 0x0f) | (0x2 << 4); bs[9] = domain as u8;
bs[0..4].copy_from_slice(&id.to_be_bytes());
Uuid::from_bytes(bs)
}
pub fn new_v2_person(uuid: &Uuid) -> Self {
let uid = unsafe { libc::getuid() };
Self::new_v2(uuid, Domain::Person, uid)
}
pub fn new_v2_group(uuid: &Uuid) -> Self {
let gid = unsafe { libc::getgid() };
Self::new_v2(uuid, Domain::Group, gid)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new() {
let mut cntx = Context::new();
let node = Node::new("lo");
let u_v1 = Uuid::new_v1(&mut cntx, node);
let u = Uuid::new_v2(&u_v1, Domain::Person, 12345678);
assert_eq!(u.version(), Version(2));
assert_eq!(u.as_bytes()[0..4], 12345678u32.to_be_bytes());
}
}