taskers-domain 0.7.0

Domain model for taskers workspaces, panes, and layout state.
Documentation
use std::{fmt, str::FromStr};

use serde::{Deserialize, Serialize};
use uuid::Uuid;

macro_rules! define_id {
    ($name:ident) => {
        #[derive(
            Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
        )]
        #[serde(transparent)]
        pub struct $name(pub Uuid);

        impl $name {
            pub fn new() -> Self {
                Self(Uuid::now_v7())
            }
        }

        impl Default for $name {
            fn default() -> Self {
                Self::new()
            }
        }

        impl fmt::Display for $name {
            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
                self.0.fmt(f)
            }
        }

        impl FromStr for $name {
            type Err = uuid::Error;

            fn from_str(s: &str) -> Result<Self, Self::Err> {
                Ok(Self(Uuid::parse_str(s)?))
            }
        }
    };
}

define_id!(WindowId);
define_id!(WorkspaceId);
define_id!(WorkspaceColumnId);
define_id!(WorkspaceWindowId);
define_id!(WorkspaceWindowTabId);
define_id!(PaneContainerId);
define_id!(PaneTabId);
define_id!(PaneId);
define_id!(SurfaceId);
define_id!(SessionId);
define_id!(NotificationId);