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