use serde::{Deserialize, Serialize}; macro_rules! id_type { ($name:ident) => { #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct $name(String); impl $name { pub fn new(value: impl Into) -> Self { let value = value.into(); assert!( !value.trim().is_empty(), concat!(stringify!($name), " cannot be empty") ); Self(value) } pub fn as_str(&self) -> &str { &self.0 } } impl From<&str> for $name { fn from(value: &str) -> Self { Self::new(value) } } impl std::fmt::Display for $name { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str(&self.0) } } }; } id_type!(AgentId); id_type!(ArtifactId); id_type!(NodeId); id_type!(ProcessId); id_type!(ProjectId); id_type!(TaskDefinitionId); id_type!(TaskInstanceId); id_type!(TenantId); id_type!(UserId);