use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum ReviewStatus {
#[default]
Completed,
Skipped,
Degraded,
}
impl ReviewStatus {
pub fn is_authoritative(&self) -> bool {
matches!(self, ReviewStatus::Completed)
}
pub fn is_skipped(&self) -> bool {
matches!(self, ReviewStatus::Skipped)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn review_status_serde_roundtrip() {
let cases = [
(ReviewStatus::Completed, "\"completed\""),
(ReviewStatus::Skipped, "\"skipped\""),
(ReviewStatus::Degraded, "\"degraded\""),
];
for (status, expected) in cases {
let json = serde_json::to_string(&status).expect("serialise");
assert_eq!(json, expected, "serialise mismatch for {status:?}");
let back: ReviewStatus = serde_json::from_str(&json).expect("deserialise");
assert_eq!(back, status);
}
}
#[test]
fn review_status_default_is_completed() {
assert_eq!(ReviewStatus::default(), ReviewStatus::Completed);
}
#[test]
fn review_status_is_authoritative() {
assert!(ReviewStatus::Completed.is_authoritative());
assert!(!ReviewStatus::Skipped.is_authoritative());
assert!(!ReviewStatus::Degraded.is_authoritative());
assert!(ReviewStatus::Skipped.is_skipped());
assert!(!ReviewStatus::Completed.is_skipped());
assert!(!ReviewStatus::Degraded.is_skipped());
}
}