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#[derive(Deserialize, Serialize)]
8pub enum MemberId<Tag> {
9    Legacy {
10        raw_id: u32,
11        _phantom: PhantomData<Tag>,
12    },
13}
14
15impl<Tag> MemberId<Tag> {
16    pub fn from_raw_id(raw_id: u32) -> Self {
17        MemberId::Legacy {
18            raw_id,
19            _phantom: PhantomData,
20        }
21    }
22
23    pub fn get_raw_id(&self) -> u32 {
24        match self {
25            MemberId::Legacy { raw_id, .. } => *raw_id,
26        }
27    }
28}
29
30impl<Tag> Debug for MemberId<Tag> {
31    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
32        match self {
33            MemberId::Legacy { raw_id, .. } => write!(
34                f,
35                "MemberId::<{}>({})",
36                std::any::type_name::<Tag>(),
37                raw_id
38            ),
39        }
40    }
41}
42
43impl<Tag> Display for MemberId<Tag> {
44    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45        match self {
46            MemberId::Legacy { raw_id, .. } => {
47                write!(
48                    f,
49                    "MemberId::<{}>({})",
50                    std::any::type_name::<Tag>(),
51                    raw_id
52                )
53            }
54        }
55    }
56}
57
58impl<Tag> PartialOrd for MemberId<Tag> {
59    #[expect(
60        clippy::non_canonical_partial_ord_impl,
61        reason = "The implementation _is_ non-canonical."
62    )]
63    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
64        match (self, other) {
65            (
66                MemberId::Legacy { raw_id, _phantom },
67                MemberId::Legacy {
68                    raw_id: other_raw_id,
69                    _phantom: _other_phantom,
70                },
71            ) => Some(raw_id.cmp(other_raw_id)),
72        }
73    }
74}
75
76impl<Tag> Ord for MemberId<Tag> {
77    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
78        self.partial_cmp(other)
79            .expect("Can't compare different kinds of member ids")
80    }
81}
82
83impl<Tag> Clone for MemberId<Tag> {
84    fn clone(&self) -> Self {
85        match self {
86            MemberId::Legacy { raw_id, .. } => MemberId::Legacy {
87                raw_id: *raw_id,
88                _phantom: PhantomData,
89            },
90        }
91    }
92}
93
94impl<Tag> PartialEq for MemberId<Tag> {
95    fn eq(&self, other: &Self) -> bool {
96        match (self, other) {
97            (
98                MemberId::Legacy { raw_id, _phantom },
99                MemberId::Legacy {
100                    raw_id: other_raw_id,
101                    _phantom: _other_phantom,
102                },
103            ) => raw_id == other_raw_id,
104        }
105    }
106}
107
108impl<Tag> Eq for MemberId<Tag> {}
109
110impl<Tag> Hash for MemberId<Tag> {
111    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
112        match self {
113            MemberId::Legacy { raw_id, _phantom } => raw_id.hash(state),
114        }
115    }
116}