hydro_lang/location/
member_id.rs

1use std::fmt::{Debug, Display};
2use std::hash::Hash;
3use std::marker::PhantomData;
4
5use serde::{Deserialize, Serialize};
6
7#[repr(transparent)]
8pub struct MemberId<Tag> {
9    pub raw_id: u32,
10    pub(crate) _phantom: PhantomData<Tag>,
11}
12
13impl<Tag> MemberId<Tag> {
14    pub fn from_raw(id: u32) -> Self {
15        MemberId {
16            raw_id: id,
17            _phantom: PhantomData,
18        }
19    }
20}
21
22impl<Tag> Debug for MemberId<Tag> {
23    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24        write!(
25            f,
26            "MemberId::<{}>({})",
27            std::any::type_name::<Tag>(),
28            self.raw_id
29        )
30    }
31}
32
33impl<Tag> Display for MemberId<Tag> {
34    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35        write!(
36            f,
37            "MemberId::<{}>({})",
38            std::any::type_name::<Tag>(),
39            self.raw_id
40        )
41    }
42}
43
44impl<Tag> Clone for MemberId<Tag> {
45    fn clone(&self) -> Self {
46        *self
47    }
48}
49
50impl<Tag> Copy for MemberId<Tag> {}
51
52impl<Tag> Serialize for MemberId<Tag> {
53    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
54    where
55        S: serde::ser::Serializer,
56    {
57        self.raw_id.serialize(serializer)
58    }
59}
60
61impl<'de, Tag> Deserialize<'de> for MemberId<Tag> {
62    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
63    where
64        D: serde::de::Deserializer<'de>,
65    {
66        u32::deserialize(deserializer).map(|id| MemberId {
67            raw_id: id,
68            _phantom: PhantomData,
69        })
70    }
71}
72
73impl<Tag> PartialEq for MemberId<Tag> {
74    fn eq(&self, other: &Self) -> bool {
75        self.raw_id == other.raw_id
76    }
77}
78
79impl<Tag> Eq for MemberId<Tag> {}
80
81impl<Tag> Hash for MemberId<Tag> {
82    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
83        self.raw_id.hash(state)
84    }
85}