use crate::Name;
use serde::{Deserialize, Deserializer, Serialize};
use std::ops::Deref;
use std::sync::atomic::AtomicU64;
static COMPONENT_IDS: AtomicU64 = AtomicU64::new(1);
#[derive(Debug, Serialize, Deserialize)]
pub struct Component {
#[serde(skip_deserializing, default)]
pub id: ComponentId,
pub name: ComponentName,
#[serde(default)]
pub description: Option<String>,
}
pub type ComponentRef = ComponentName;
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
#[serde(transparent)]
pub struct ComponentId(u64);
impl Default for ComponentId {
fn default() -> Self {
Self(COMPONENT_IDS.fetch_add(1, std::sync::atomic::Ordering::SeqCst))
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
#[serde(transparent)]
pub struct ComponentName(pub(crate) Name);
impl Deref for ComponentName {
type Target = Name;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<'de> Deserialize<'de> for ComponentName {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let type_name = String::deserialize(deserializer)?;
Ok(Self(Name::new(type_name, "Component")))
}
}