use serde::{Deserialize, Serialize}; use std::fmt; macro_rules! define_id { ($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 { Self(value.into()) } pub fn as_str(&self) -> &str { &self.0 } } impl From for $name { fn from(value: String) -> Self { Self(value) } } impl From<&str> for $name { fn from(value: &str) -> Self { Self(value.to_owned()) } } impl AsRef for $name { fn as_ref(&self) -> &str { self.as_str() } } impl fmt::Display for $name { fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str(self.as_str()) } } }; } define_id!(OperationId); define_id!(DescriptorId); define_id!(ToolId); define_id!(SampleId); define_id!(AuthProfileId); define_id!(WorkspaceId); define_id!(TenantId); define_id!(UserId); define_id!(UserSessionId); define_id!(AgentId); define_id!(InvitationId); define_id!(PlatformApiKeyId); define_id!(InvocationLogId); define_id!(AuditEventId); define_id!(SecretId); define_id!(StreamSessionId); define_id!(AsyncJobId); #[cfg(test)] mod tests { use super::*; #[test] fn ids_implement_display() { let workspace_id = WorkspaceId::new("ws_default"); assert_eq!(workspace_id.to_string(), "ws_default"); assert_eq!(format!("{workspace_id}"), "ws_default"); } }