use std::fmt::{Display, Formatter};
use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum Visibility {
Internal,
Private,
Public,
}
impl Display for Visibility {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
let string_representation = match self {
Visibility::Internal => "internal",
Visibility::Private => "private",
Visibility::Public => "public",
};
write!(f, "{}", string_representation)
}
}
#[cfg(test)]
mod tests {
use super::Visibility;
#[test]
fn trait_deserialize() {
let visibility: Visibility = serde_json::from_str(r#""internal""#).unwrap();
assert!(matches!(visibility, Visibility::Internal));
}
#[test]
fn trait_display() {
let visibility = Visibility::Private;
assert_eq!("private", visibility.to_string());
}
#[test]
fn trait_send() {
fn assert_send<T: Send>() {}
assert_send::<Visibility>();
}
#[test]
fn trait_sync() {
fn assert_sync<T: Sync>() {}
assert_sync::<Visibility>();
}
}