1use mago_syntax::cst::Modifier;
2
3#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Default, PartialOrd, Ord)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6#[repr(u8)]
7pub enum Visibility {
8 #[default]
11 Public,
12 Protected,
15 Private,
17}
18
19impl Visibility {
20 #[inline]
22 #[must_use]
23 pub const fn is_public(&self) -> bool {
24 matches!(self, Visibility::Public)
25 }
26
27 #[inline]
29 #[must_use]
30 pub const fn is_protected(&self) -> bool {
31 matches!(self, Visibility::Protected)
32 }
33
34 #[inline]
36 #[must_use]
37 pub const fn is_private(&self) -> bool {
38 matches!(self, Visibility::Private)
39 }
40
41 #[inline]
43 #[must_use]
44 pub const fn as_bytes(&self) -> &'static [u8] {
45 match self {
46 Visibility::Public => b"public",
47 Visibility::Protected => b"protected",
48 Visibility::Private => b"private",
49 }
50 }
51}
52
53impl std::fmt::Display for Visibility {
55 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
56 write!(f, "{}", mago_bytes::BytesDisplay(self.as_bytes()))
57 }
58}
59
60impl TryFrom<&Modifier<'_>> for Visibility {
62 type Error = ();
63
64 fn try_from(value: &Modifier<'_>) -> Result<Self, Self::Error> {
65 match value {
66 Modifier::Public(_) | Modifier::PublicSet(_) => Ok(Visibility::Public),
67 Modifier::Protected(_) | Modifier::ProtectedSet(_) => Ok(Visibility::Protected),
68 Modifier::Private(_) | Modifier::PrivateSet(_) => Ok(Visibility::Private),
69 _ => Err(()),
70 }
71 }
72}