use serde::Deserialize;
use serde::Serialize;
use mago_syntax::ast::Modifier;
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Serialize, Deserialize, Default, PartialOrd, Ord)]
#[repr(u8)]
pub enum Visibility {
#[default]
Public,
Protected,
Private,
}
impl Visibility {
#[inline]
#[must_use]
pub const fn is_public(&self) -> bool {
matches!(self, Visibility::Public)
}
#[inline]
#[must_use]
pub const fn is_protected(&self) -> bool {
matches!(self, Visibility::Protected)
}
#[inline]
#[must_use]
pub const fn is_private(&self) -> bool {
matches!(self, Visibility::Private)
}
#[inline]
#[must_use]
pub const fn as_str(&self) -> &'static str {
match self {
Visibility::Public => "public",
Visibility::Protected => "protected",
Visibility::Private => "private",
}
}
}
impl std::fmt::Display for Visibility {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
impl TryFrom<&Modifier<'_>> for Visibility {
type Error = ();
fn try_from(value: &Modifier<'_>) -> Result<Self, Self::Error> {
match value {
Modifier::Public(_) | Modifier::PublicSet(_) => Ok(Visibility::Public),
Modifier::Protected(_) | Modifier::ProtectedSet(_) => Ok(Visibility::Protected),
Modifier::Private(_) | Modifier::PrivateSet(_) => Ok(Visibility::Private),
_ => Err(()),
}
}
}