use serde::{Deserialize, Deserializer, Serialize};
use uuid::Uuid;
use crate::error::Result;
use super::validate_not_empty;
pub type KeepsakeId = Uuid;
pub type RelationId = Uuid;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
pub struct SubjectRef {
kind: String,
id: String,
}
impl SubjectRef {
pub fn new(kind: impl Into<String>, id: impl Into<String>) -> Result<Self> {
let subject = Self {
kind: kind.into(),
id: id.into(),
};
subject.validate()?;
Ok(subject)
}
pub fn validate(&self) -> Result<()> {
validate_not_empty("subject.kind", self.kind())?;
validate_not_empty("subject.id", self.id())
}
#[must_use]
pub fn kind(&self) -> &str {
&self.kind
}
#[must_use]
pub fn id(&self) -> &str {
&self.id
}
}
impl<'de> Deserialize<'de> for SubjectRef {
fn deserialize<D>(deserializer: D) -> core::result::Result<Self, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
struct SubjectRefRecord {
kind: String,
id: String,
}
let record = SubjectRefRecord::deserialize(deserializer)?;
Self::new(record.kind, record.id).map_err(serde::de::Error::custom)
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
pub struct ActorRef {
kind: String,
id: String,
}
impl ActorRef {
pub fn new(kind: impl Into<String>, id: impl Into<String>) -> Result<Self> {
let actor = Self {
kind: kind.into(),
id: id.into(),
};
actor.validate()?;
Ok(actor)
}
pub fn validate(&self) -> Result<()> {
validate_not_empty("actor.kind", self.kind())?;
validate_not_empty("actor.id", self.id())
}
#[must_use]
pub fn kind(&self) -> &str {
&self.kind
}
#[must_use]
pub fn id(&self) -> &str {
&self.id
}
}
impl<'de> Deserialize<'de> for ActorRef {
fn deserialize<D>(deserializer: D) -> core::result::Result<Self, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
struct ActorRefRecord {
kind: String,
id: String,
}
let record = ActorRefRecord::deserialize(deserializer)?;
Self::new(record.kind, record.id).map_err(serde::de::Error::custom)
}
}