use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TreatmentLine {
pub line: LineOfTherapy,
pub drug_classes: Vec<String>,
pub representative_drugs: Vec<String>,
pub evidence_level: EvidenceLevel,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum LineOfTherapy {
First,
Second,
Third,
Adjunct,
Supportive,
}
impl std::fmt::Display for LineOfTherapy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::First => f.write_str("First Line"),
Self::Second => f.write_str("Second Line"),
Self::Third => f.write_str("Third Line"),
Self::Adjunct => f.write_str("Adjunct"),
Self::Supportive => f.write_str("Supportive"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum EvidenceLevel {
IA,
IB,
IIA,
IIB,
III,
IV,
}
impl std::fmt::Display for EvidenceLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::IA => f.write_str("IA"),
Self::IB => f.write_str("IB"),
Self::IIA => f.write_str("IIA"),
Self::IIB => f.write_str("IIB"),
Self::III => f.write_str("III"),
Self::IV => f.write_str("IV"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn line_ordering_is_correct() {
assert!(LineOfTherapy::First < LineOfTherapy::Second);
assert!(LineOfTherapy::Second < LineOfTherapy::Third);
}
#[test]
fn evidence_ordering_ia_strongest() {
assert!(EvidenceLevel::IA < EvidenceLevel::IB);
assert!(EvidenceLevel::IB < EvidenceLevel::IIA);
assert!(EvidenceLevel::III < EvidenceLevel::IV);
}
#[test]
fn treatment_line_round_trip_serde() {
let line = TreatmentLine {
line: LineOfTherapy::First,
drug_classes: vec!["Biguanides".to_string()],
representative_drugs: vec!["metformin".to_string()],
evidence_level: EvidenceLevel::IA,
};
let json = serde_json::to_string(&line).expect("serialise");
let parsed: TreatmentLine = serde_json::from_str(&json).expect("deserialise");
assert_eq!(line, parsed);
}
#[test]
fn line_of_therapy_display() {
assert_eq!(LineOfTherapy::First.to_string(), "First Line");
assert_eq!(LineOfTherapy::Adjunct.to_string(), "Adjunct");
}
#[test]
fn evidence_level_display() {
assert_eq!(EvidenceLevel::IA.to_string(), "IA");
assert_eq!(EvidenceLevel::IV.to_string(), "IV");
}
}