use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[cfg_attr(feature = "json-schema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "json-schema", schemars(rename = "Angebotsstatus"))]
#[non_exhaustive]
pub enum OfferStatus {
#[serde(rename = "KONZEPTION")]
Concept,
#[serde(rename = "UNVERBINDLICH")]
NonBinding,
#[serde(rename = "VERBINDLICH")]
Binding,
#[serde(rename = "BEAUFTRAGT")]
Commissioned,
#[serde(rename = "UNGUELTIG")]
Invalid,
#[serde(rename = "ABGELEHNT")]
Rejected,
#[serde(rename = "NACHGEFASST")]
FollowedUp,
#[serde(rename = "AUSSTEHEND")]
Pending,
#[serde(rename = "ERLEDIGT")]
Completed,
}
impl OfferStatus {
pub fn german_name(&self) -> &'static str {
match self {
Self::Concept => "Konzeption",
Self::NonBinding => "Unverbindlich",
Self::Binding => "Verbindlich",
Self::Commissioned => "Beauftragt",
Self::Invalid => "Ungueltig",
Self::Rejected => "Abgelehnt",
Self::FollowedUp => "Nachgefasst",
Self::Pending => "Ausstehend",
Self::Completed => "Erledigt",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_serialize() {
assert_eq!(
serde_json::to_string(&OfferStatus::Concept).unwrap(),
r#""KONZEPTION""#
);
assert_eq!(
serde_json::to_string(&OfferStatus::Binding).unwrap(),
r#""VERBINDLICH""#
);
}
#[test]
fn test_deserialize() {
assert_eq!(
serde_json::from_str::<OfferStatus>(r#""KONZEPTION""#).unwrap(),
OfferStatus::Concept
);
assert_eq!(
serde_json::from_str::<OfferStatus>(r#""ERLEDIGT""#).unwrap(),
OfferStatus::Completed
);
}
#[test]
fn test_roundtrip() {
for status in [
OfferStatus::Concept,
OfferStatus::NonBinding,
OfferStatus::Binding,
OfferStatus::Commissioned,
OfferStatus::Invalid,
OfferStatus::Rejected,
OfferStatus::FollowedUp,
OfferStatus::Pending,
OfferStatus::Completed,
] {
let json = serde_json::to_string(&status).unwrap();
let parsed: OfferStatus = serde_json::from_str(&json).unwrap();
assert_eq!(status, parsed);
}
}
}