#[cfg(any(
feature = "uuid-generator-v3",
feature = "uuid-generator-v4",
feature = "uuid-generator-v5"
))]
use {
super::{Generator, IriGenerator},
crate::Id,
};
pub enum UuidGenerator {
#[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 UuidGenerator {
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 IriGenerator for UuidGenerator {
fn next_iri(&mut self) -> iref::IriBuf {
let mut buffer: Vec<u8> = vec![0; uuid::adapter::Urn::LENGTH];
let uuid = self.next_uuid();
let len = uuid.to_urn().encode_lower(buffer.as_mut()).len();
buffer.truncate(len);
iref::IriBuf::from_bytes(buffer).unwrap()
}
}
#[cfg(any(
feature = "uuid-generator-v3",
feature = "uuid-generator-v4",
feature = "uuid-generator-v5"
))]
impl Generator for UuidGenerator {
fn next_id(&mut self) -> Id {
Id::Iri(self.next_iri())
}
}
#[cfg(any(
feature = "uuid-generator-v3",
feature = "uuid-generator-v4",
feature = "uuid-generator-v5"
))]
#[cfg(test)]
mod tests {
use super::*;
#[cfg(feature = "uuid-generator-v3")]
#[test]
fn uuidv3_iri() {
let mut uuid_gen = UuidGenerator::V3(
uuid::Uuid::parse_str("936DA01F9ABD4d9d80C702AF85C822A8").unwrap(),
"test".to_string(),
);
for _ in 0..100 {
use crate::generator::IriGenerator;
let reference = uuid_gen.next_iri();
assert!(iref::Iri::new(reference.as_str()).is_ok())
}
}
#[cfg(feature = "uuid-generator-v4")]
#[test]
fn uuidv4_iri() {
let mut uuid_gen = UuidGenerator::V4;
for _ in 0..100 {
use crate::generator::IriGenerator;
let reference = uuid_gen.next_iri();
assert!(iref::Iri::new(reference.as_str()).is_ok())
}
}
#[cfg(feature = "uuid-generator-v5")]
#[test]
fn uuidv5_iri() {
let mut uuid_gen = UuidGenerator::V5(
uuid::Uuid::parse_str("936DA01F9ABD4d9d80C702AF85C822A8").unwrap(),
"test".to_string(),
);
for _ in 0..100 {
use crate::generator::IriGenerator;
let reference = uuid_gen.next_iri();
assert!(iref::Iri::new(reference.as_str()).is_ok())
}
}
}