use std::ops::Deref;
use uuid::Uuid;
pub trait UuidVersion: Deref<Target=Uuid> {}
#[derive(Debug)]
pub struct V1(Uuid);
impl UuidVersion for V1 {}
impl Default for V1 {
fn default() -> Self {
Self(Uuid::now_v1(&Default::default()))
}
}
impl Deref for V1 {
type Target = Uuid;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[derive(Debug)]
pub struct V3(Uuid);
impl UuidVersion for V3 {}
impl Default for V3 {
fn default() -> Self {
Self(Uuid::new_v3(&Uuid::NAMESPACE_DNS, Default::default()))
}
}
impl Deref for V3 {
type Target = Uuid;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[derive(Debug)]
pub struct V4(Uuid);
impl UuidVersion for V4 {}
impl Default for V4 {
fn default() -> Self {
Self(Uuid::new_v4())
}
}
impl Deref for V4 {
type Target = Uuid;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[derive(Debug)]
pub struct V5(Uuid);
impl UuidVersion for V5 {}
impl Deref for V5 {
type Target = Uuid;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl Default for V5 {
fn default() -> Self {
Self(Uuid::new_v5(&Uuid::NAMESPACE_DNS, Default::default()))
}
}
#[derive(Debug)]
pub struct V6(Uuid);
impl UuidVersion for V6 {}
impl Deref for V6 {
type Target = Uuid;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl Default for V6 {
fn default() -> Self {
Self(Uuid::now_v6(&Default::default()))
}
}
#[derive(Debug)]
pub struct V7(Uuid);
impl Deref for V7 {
type Target = Uuid;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl UuidVersion for V7 {}
impl Default for V7 {
fn default() -> Self {
Self(Uuid::now_v7())
}
}
#[derive(Debug)]
pub struct Nil(Uuid);
impl Deref for Nil {
type Target = Uuid;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl UuidVersion for Nil {}
impl Default for Nil {
fn default() -> Self {
Self(Uuid::nil())
}
}