use activitystreams_vocabulary::{impl_default, impl_display};
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum ReviewStatus {
Approve,
Remark,
Revise,
Awaiting,
Dismissed,
DismissedAwaiting,
}
impl ReviewStatus {
pub const APPROVE: &str = "approve";
pub const REMARK: &str = "remark";
pub const REVISE: &str = "revise";
pub const AWAITING: &str = "awaiting";
pub const DISMISSED: &str = "dismissed";
pub const DISMISSED_AWAITING: &str = "dismissedAwaiting";
pub const fn new() -> Self {
Self::Approve
}
pub const fn as_str(&self) -> &'static str {
match self {
Self::Approve => Self::APPROVE,
Self::Remark => Self::REMARK,
Self::Revise => Self::REVISE,
Self::Awaiting => Self::AWAITING,
Self::Dismissed => Self::DISMISSED,
Self::DismissedAwaiting => Self::DISMISSED_AWAITING,
}
}
}
impl_default!(ReviewStatus);
impl_display!(ReviewStatus, str);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_review_verdict() {
[
(ReviewStatus::Approve, ReviewStatus::APPROVE),
(ReviewStatus::Remark, ReviewStatus::REMARK),
(ReviewStatus::Revise, ReviewStatus::REVISE),
(ReviewStatus::Awaiting, ReviewStatus::AWAITING),
(ReviewStatus::Dismissed, ReviewStatus::DISMISSED),
(
ReviewStatus::DismissedAwaiting,
ReviewStatus::DISMISSED_AWAITING,
),
]
.into_iter()
.for_each(|(verdict, verdict_str)| {
let json_str = format!(r#""{verdict_str}""#);
assert_eq!(verdict.to_string(), verdict_str);
assert_eq!(serde_json::to_string(&verdict).unwrap(), json_str);
assert_eq!(
serde_json::from_str::<ReviewStatus>(&json_str).unwrap(),
verdict
);
});
}
}