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 pub const fn is_public(&self) -> bool {
25 matches!(self, Visibility::Public)
26 }
27
28 #[inline]
30 pub const fn is_protected(&self) -> bool {
31 matches!(self, Visibility::Protected)
32 }
33
34 #[inline]
36 pub const fn is_private(&self) -> bool {
37 matches!(self, Visibility::Private)
38 }
39
40 #[inline]
42 pub const fn as_str(&self) -> &'static str {
43 match self {
44 Visibility::Public => "public",
45 Visibility::Protected => "protected",
46 Visibility::Private => "private",
47 }
48 }
49}
50
51impl std::fmt::Display for Visibility {
53 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
54 write!(f, "{}", self.as_str())
55 }
56}
57
58impl TryFrom<&Modifier<'_>> for Visibility {
60 type Error = ();
61
62 fn try_from(value: &Modifier<'_>) -> Result<Self, Self::Error> {
63 match value {
64 Modifier::Public(_) | Modifier::PublicSet(_) => Ok(Visibility::Public),
65 Modifier::Protected(_) | Modifier::ProtectedSet(_) => Ok(Visibility::Protected),
66 Modifier::Private(_) | Modifier::PrivateSet(_) => Ok(Visibility::Private),
67 _ => Err(()),
68 }
69 }
70}