hydro_lang/location/
member_id.rs1use 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}