use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum CategorySeverity {
Nominal,
Caution,
Alarm,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CategoryItem {
pub value: i64,
pub label: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub severity: Option<CategorySeverity>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum RampHint {
Sequential,
Diverging,
Banded,
Categorical { items: Vec<CategoryItem> },
}
#[derive(Debug, Clone, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct VariableDescriptor {
pub id: &'static str,
pub label: &'static str,
#[serde(skip_serializing_if = "Option::is_none")]
pub symbol: Option<&'static str>,
pub quantity: Option<&'static str>,
pub ramp: RampHint,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ramp_hint_serialises_tagged() {
let ramp = RampHint::Categorical {
items: vec![CategoryItem {
value: 3,
label: "Open".into(),
severity: Some(CategorySeverity::Nominal),
}],
};
let json = serde_json::to_value(&ramp).unwrap();
assert_eq!(json["type"], "categorical");
assert_eq!(json["items"][0]["value"], 3);
assert_eq!(json["items"][0]["severity"], "nominal");
}
#[test]
fn a_state_without_a_judgement_omits_severity() {
let ramp = RampHint::Categorical {
items: vec![CategoryItem {
value: 1,
label: "Concrete".into(),
severity: None,
}],
};
let json = serde_json::to_value(&ramp).unwrap();
assert!(
json["items"][0].get("severity").is_none(),
"absent severity must not serialise, got {}",
json["items"][0]
);
}
#[test]
fn severity_round_trips() {
for level in [
CategorySeverity::Nominal,
CategorySeverity::Caution,
CategorySeverity::Alarm,
] {
let item = CategoryItem {
value: 0,
label: "s".into(),
severity: Some(level),
};
let json = serde_json::to_string(&item).unwrap();
let back: CategoryItem = serde_json::from_str(&json).unwrap();
assert_eq!(back.severity, Some(level));
}
}
}