pub enum Uuid {
#[cfg(feature = "uuid-generator-v3")]
V3(uuid::Uuid, String),
#[cfg(feature = "uuid-generator-v4")]
V4,
#[cfg(feature = "uuid-generator-v5")]
V5(uuid::Uuid, String),
}
#[cfg(any(feature = "uuid-generator-v3", feature = "uuid-generator-v4", feature = "uuid-generator-v5"))]
impl Uuid {
pub fn next_uuid(&self) -> uuid::Uuid {
match self {
#[cfg(feature = "uuid-generator-v3")]
Self::V3(vocabulary, name) => uuid::Uuid::new_v3(vocabulary, name.as_bytes()),
#[cfg(feature = "uuid-generator-v4")]
Self::V4 => uuid::Uuid::new_v4(),
#[cfg(feature = "uuid-generator-v5")]
Self::V5(vocabulary, name) => uuid::Uuid::new_v5(vocabulary, name.as_bytes()),
}
}
}
#[cfg(any(feature = "uuid-generator-v3", feature = "uuid-generator-v4", feature = "uuid-generator-v5"))]
impl crate::Generator for Uuid {
fn next_term(&mut self) -> crate::Term {
let mut buffer: Vec<u8> = vec![0; uuid::fmt::Urn::LENGTH];
let uuid = self.next_uuid();
let len = uuid.urn().encode_lower(buffer.as_mut()).len();
buffer.truncate(len);
let s = unsafe { String::from_utf8_unchecked(buffer) };
crate::Term::Iri(iri_rs::IriBuf::parse_unchecked(s))
}
}
#[cfg(any(feature = "uuid-generator-v3", feature = "uuid-generator-v4", feature = "uuid-generator-v5"))]
#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::panic, clippy::expect_used)]
mod tests {
use super::*;
use crate::Generator;
#[cfg(feature = "uuid-generator-v3")]
#[test]
fn uuidv3_iri() {
let mut uuid_gen = Uuid::V3(uuid::Uuid::parse_str("936DA01F9ABD4d9d80C702AF85C822A8").unwrap(), "test".to_string());
for _ in 0..100 {
let term = uuid_gen.next_term();
assert!(term.as_iri().is_some())
}
}
#[cfg(feature = "uuid-generator-v4")]
#[test]
fn uuidv4_iri() {
let mut uuid_gen = Uuid::V4;
for _ in 0..100 {
let term = uuid_gen.next_term();
assert!(term.as_iri().is_some())
}
}
#[cfg(feature = "uuid-generator-v5")]
#[test]
fn uuidv5_iri() {
let mut uuid_gen = Uuid::V5(uuid::Uuid::parse_str("936DA01F9ABD4d9d80C702AF85C822A8").unwrap(), "test".to_string());
for _ in 0..100 {
let term = uuid_gen.next_term();
assert!(term.as_iri().is_some())
}
}
}