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_str(&self) -> &'static str {
47 match self {
48 Visibility::Public => "public",
49 Visibility::Protected => "protected",
50 Visibility::Private => "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, "{}", self.as_str())
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}