use clap::ValueEnum;
#[cfg(feature = "json")]
use serde::Serialize;
#[cfg_attr(feature = "json", derive(Serialize))]
#[cfg_attr(feature = "json", serde(rename_all = "lowercase"))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum UuidVersion {
#[value(name = "v4")]
V4,
#[value(name = "v7")]
V7,
}
impl UuidVersion {
pub const fn default() -> Self {
Self::V7
}
pub const fn as_str(&self) -> &'static str {
match self {
Self::V4 => "v4",
Self::V7 => "v7",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_version() {
assert_eq!(UuidVersion::default(), UuidVersion::V7);
}
#[test]
fn test_version_variants() {
let variants = [UuidVersion::V4, UuidVersion::V7];
for (i, v1) in variants.iter().enumerate() {
for (j, v2) in variants.iter().enumerate() {
if i == j {
assert_eq!(v1, v2);
} else {
assert_ne!(v1, v2);
}
}
}
}
#[test]
fn test_as_str() {
assert_eq!(UuidVersion::V4.as_str(), "v4");
assert_eq!(UuidVersion::V7.as_str(), "v7");
}
#[test]
#[cfg(feature = "json")]
fn test_json_serialization() {
assert_eq!(serde_json::to_string(&UuidVersion::V4).unwrap(), "\"v4\"");
assert_eq!(serde_json::to_string(&UuidVersion::V7).unwrap(), "\"v7\"");
}
}