use crate::{
define_enum_from_json, json,
tariff::Warning,
warning::{self, IntoCaveat as _},
Enum, IntoEnum, Verdict,
};
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub(crate) enum DimensionType {
Energy,
Flat,
ParkingTime,
Time,
}
impl IntoEnum for DimensionType {
fn enum_from_str(s: &str) -> Enum<Self> {
let dt = if s.eq_ignore_ascii_case("energy") {
DimensionType::Energy
} else if s.eq_ignore_ascii_case("flat") {
DimensionType::Flat
} else if s.eq_ignore_ascii_case("parking_time") {
DimensionType::ParkingTime
} else if s.eq_ignore_ascii_case("time") {
DimensionType::Time
} else {
return Enum::Unknown(s.to_string());
};
Enum::Known(dt)
}
}
define_enum_from_json!(DimensionType, display_name: "DimensionType", warning_id: "dimension_type");
impl json::FromJson<'_> for u64 {
type Warning = Warning;
fn from_json(elem: &'_ json::Element<'_>) -> Verdict<Self, Self::Warning> {
let warnings = warning::Set::new();
let Some(s) = elem.as_number_str() else {
return warnings.bail(
Warning::FieldInvalidType {
expected_type: json::ValueKind::Number,
},
elem,
);
};
let n = match s.parse::<u64>() {
Ok(n) => n,
Err(err) => {
return warnings.bail(Warning::field_invalid_value(s, err.to_string()), elem);
}
};
Ok(n.into_caveat(warnings))
}
}