use crate::displayer::{DisplayProxy, DisplayerOf};
#[cfg(feature="serde")]
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::cmp::Ordering;
use std::fmt;
use std::hash::{Hash, Hasher};
use std::marker::PhantomData;
pub struct Id<Entity, Repr>(Repr, PhantomData<std::sync::Mutex<Entity>>);
impl<Entity, Repr> Id<Entity, Repr> {
pub const fn get(&self) -> &Repr {
&self.0
}
pub const fn new(repr: Repr) -> Id<Entity, Repr> {
Id(repr, PhantomData)
}
}
impl<Entity, Repr> Id<Entity, Repr>
where
Entity: DisplayerOf<Id<Entity, Repr>>,
{
pub fn display(&self) -> DisplayProxy<'_, Self, Entity> {
DisplayProxy::new(self)
}
}
impl<Entity, Repr: Clone> Clone for Id<Entity, Repr> {
fn clone(&self) -> Self {
Self::from(self.get().clone())
}
}
impl<Entity, Repr: Copy> Copy for Id<Entity, Repr> {}
impl<Entity, Repr: PartialEq> PartialEq for Id<Entity, Repr> {
fn eq(&self, rhs: &Self) -> bool {
self.get().eq(&rhs.get())
}
}
impl<Entity, Repr: PartialOrd> PartialOrd for Id<Entity, Repr> {
fn partial_cmp(&self, rhs: &Self) -> Option<Ordering> {
self.get().partial_cmp(&rhs.get())
}
}
impl<Entity, Repr: Ord> Ord for Id<Entity, Repr> {
fn cmp(&self, rhs: &Self) -> Ordering {
self.get().cmp(&rhs.get())
}
}
impl<Entity, Repr: Hash> Hash for Id<Entity, Repr> {
fn hash<H: Hasher>(&self, state: &mut H) {
self.get().hash(state)
}
}
impl<Entity, Repr> From<Repr> for Id<Entity, Repr> {
fn from(repr: Repr) -> Self {
Self::new(repr)
}
}
impl<Entity, Repr: Eq> Eq for Id<Entity, Repr> {}
impl<Entity, Repr: fmt::Debug> fmt::Debug for Id<Entity, Repr> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", self.get())
}
}
impl<Entity, Repr: fmt::Display> fmt::Display for Id<Entity, Repr> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.get())
}
}
#[cfg(feature="serde")]
impl<Entity, Repr> Serialize for Id<Entity, Repr>
where
Repr: Serialize,
{
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.get().serialize(serializer)
}
}
#[cfg(feature="serde")]
impl<'de, Entity, Repr> Deserialize<'de> for Id<Entity, Repr>
where
Repr: Deserialize<'de>,
{
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
Repr::deserialize(deserializer).map(Id::<Entity, Repr>::from)
}
}