use std::convert::Infallible;
use crate::{
schema,
tariff::Warning,
warning::{self, IntoCaveat as _},
FromSchema, Verdict,
};
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub(crate) enum DimensionType {
Energy,
Flat,
ParkingTime,
Time,
}
impl FromSchema<'_, schema::v211::TariffDimensionType> for DimensionType {
type Warning = Infallible;
fn from_schema(source: &schema::v211::TariffDimensionType) -> Verdict<Self, Self::Warning> {
use schema::v211::TariffDimensionType;
let v = match source {
TariffDimensionType::Energy => Self::Energy,
TariffDimensionType::Flat => Self::Flat,
TariffDimensionType::ParkingTime => Self::ParkingTime,
TariffDimensionType::Time => Self::Time,
};
Ok(v.into_infallible_caveat())
}
}
impl FromSchema<'_, schema::v221::TariffDimensionType> for DimensionType {
type Warning = Infallible;
fn from_schema(source: &schema::v221::TariffDimensionType) -> Verdict<Self, Self::Warning> {
use schema::v221::TariffDimensionType;
let v = match source {
TariffDimensionType::Energy => Self::Energy,
TariffDimensionType::Flat => Self::Flat,
TariffDimensionType::ParkingTime => Self::ParkingTime,
TariffDimensionType::Time => Self::Time,
};
Ok(v.into_infallible_caveat())
}
}
impl<'buf> FromSchema<'buf, schema::Number<'buf>> for u64 {
type Warning = Warning;
fn from_schema(source: &schema::Number<'buf>) -> Verdict<Self, Self::Warning> {
let warnings = warning::Set::new();
let (elem, digits) = match source {
schema::Number::Number { elem, digits } => (elem, *digits),
schema::Number::StringEncoded { elem, value } => (elem, value.as_unescaped_str()),
};
match digits.parse::<u64>() {
Ok(n) => Ok(n.into_caveat(warnings)),
Err(err) => warnings.bail(elem, Warning::field_invalid_value(digits, err.to_string())),
}
}
}