use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum InvoiceStatus {
#[serde(rename = "UNGEPRUEFT")]
Unchecked,
#[serde(rename = "GEPRUEFT_OK")]
CheckedOk,
#[serde(rename = "GEPRUEFT_FEHLERHAFT")]
CheckedWithErrors,
#[serde(rename = "GEBUCHT")]
Booked,
#[serde(rename = "BEZAHLT")]
Paid,
}
impl InvoiceStatus {
pub fn german_name(&self) -> &'static str {
match self {
Self::Unchecked => "Ungeprueft",
Self::CheckedOk => "Geprueft OK",
Self::CheckedWithErrors => "Geprueft fehlerhaft",
Self::Booked => "Gebucht",
Self::Paid => "Bezahlt",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_serialize() {
assert_eq!(
serde_json::to_string(&InvoiceStatus::Unchecked).unwrap(),
r#""UNGEPRUEFT""#
);
assert_eq!(
serde_json::to_string(&InvoiceStatus::Paid).unwrap(),
r#""BEZAHLT""#
);
}
#[test]
fn test_deserialize() {
assert_eq!(
serde_json::from_str::<InvoiceStatus>(r#""UNGEPRUEFT""#).unwrap(),
InvoiceStatus::Unchecked
);
assert_eq!(
serde_json::from_str::<InvoiceStatus>(r#""GEPRUEFT_OK""#).unwrap(),
InvoiceStatus::CheckedOk
);
}
#[test]
fn test_roundtrip() {
for status in [
InvoiceStatus::Unchecked,
InvoiceStatus::CheckedOk,
InvoiceStatus::CheckedWithErrors,
InvoiceStatus::Booked,
InvoiceStatus::Paid,
] {
let json = serde_json::to_string(&status).unwrap();
let parsed: InvoiceStatus = serde_json::from_str(&json).unwrap();
assert_eq!(status, parsed);
}
}
}