use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, JsonSchema)]
pub struct LocalUserId(String);
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, JsonSchema)]
pub struct AccountId(String);
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, JsonSchema)]
pub struct AccountIdHash(String);
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, JsonSchema)]
pub struct ContractId(String);
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, JsonSchema)]
pub struct BrokerOrderId(String);
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, JsonSchema)]
pub struct RequestId(Uuid);
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, JsonSchema)]
pub struct SessionId(Uuid);
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, JsonSchema)]
pub struct AuditEventId(Uuid);
macro_rules! impl_string_id {
($type_name:ident) => {
impl $type_name {
#[must_use]
pub fn new(value: impl Into<String>) -> Option<Self> {
let value = value.into();
if value.trim().is_empty() {
None
} else {
Some(Self(value))
}
}
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
#[must_use]
pub fn from_static(value: &'static str) -> Self {
Self(value.to_string())
}
}
};
}
impl_string_id!(LocalUserId);
impl_string_id!(AccountId);
impl_string_id!(AccountIdHash);
impl_string_id!(ContractId);
impl_string_id!(BrokerOrderId);
impl AccountIdHash {
#[must_use]
pub fn from_hash(value: String) -> Self {
Self(value)
}
}
macro_rules! impl_uuid_id {
($type_name:ident) => {
impl $type_name {
#[must_use]
pub fn new() -> Self {
Self(Uuid::now_v7())
}
#[must_use]
pub const fn from_uuid(value: Uuid) -> Self {
Self(value)
}
#[must_use]
pub const fn as_uuid(&self) -> Uuid {
self.0
}
}
impl Default for $type_name {
fn default() -> Self {
Self::new()
}
}
};
}
impl_uuid_id!(RequestId);
impl_uuid_id!(SessionId);
impl_uuid_id!(AuditEventId);