use mago_syntax::cst::Modifier;
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Default, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[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_bytes(&self) -> &'static [u8] {
match self {
Visibility::Public => b"public",
Visibility::Protected => b"protected",
Visibility::Private => b"private",
}
}
}
impl std::fmt::Display for Visibility {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", mago_bytes::BytesDisplay(self.as_bytes()))
}
}
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(()),
}
}
}