use serde_repr::{Deserialize_repr, Serialize_repr};
#[repr(u64)]
#[derive(Clone, Copy, Debug, Eq, PartialEq, Deserialize_repr, Serialize_repr)]
pub enum VisibilityPolicy {
None = 0,
Muted = 1,
Unmuted = 2,
Followed = 3,
}
impl VisibilityPolicy {
pub const NONE: &str = "none";
pub const MUTED: &str = "muted";
pub const UNMUTED: &str = "unmuted";
pub const FOLLOWED: &str = "followed";
pub const fn new() -> Self {
Self::None
}
pub const fn to_u64(self) -> u64 {
self as u64
}
pub const fn as_str(&self) -> &'static str {
match self {
Self::None => Self::NONE,
Self::Muted => Self::MUTED,
Self::Unmuted => Self::UNMUTED,
Self::Followed => Self::FOLLOWED,
}
}
}
impl Default for VisibilityPolicy {
fn default() -> Self {
Self::new()
}
}
impl From<VisibilityPolicy> for u64 {
fn from(val: VisibilityPolicy) -> Self {
val.to_u64()
}
}
impl From<VisibilityPolicy> for &'static str {
fn from(val: VisibilityPolicy) -> Self {
val.as_str()
}
}
impl From<VisibilityPolicy> for String {
fn from(val: VisibilityPolicy) -> Self {
val.as_str().to_string()
}
}
impl std::fmt::Display for VisibilityPolicy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_visibility_policy() {
[
VisibilityPolicy::None,
VisibilityPolicy::Muted,
VisibilityPolicy::Unmuted,
VisibilityPolicy::Followed,
]
.into_iter()
.for_each(|vp| {
let vp_json = format!("{}", vp.to_u64());
assert_eq!(serde_json::to_string(&vp).unwrap(), vp_json);
assert_eq!(
serde_json::from_str::<VisibilityPolicy>(&vp_json).unwrap(),
vp
);
});
}
}