use core::marker::PhantomData;
use icu_provider::{DataMarker, DynamicDataMarker};
use crate::{
dimension::provider::units::{
categorized_display_names::{
UnitsNamesAreaCoreV1, UnitsNamesAreaExtendedV1, UnitsNamesAreaOutlierV1,
UnitsNamesDurationCoreV1, UnitsNamesDurationExtendedV1, UnitsNamesDurationOutlierV1,
UnitsNamesLengthCoreV1, UnitsNamesLengthExtendedV1, UnitsNamesLengthOutlierV1,
UnitsNamesMassCoreV1, UnitsNamesMassExtendedV1, UnitsNamesMassOutlierV1,
UnitsNamesVolumeCoreV1, UnitsNamesVolumeExtendedV1, UnitsNamesVolumeOutlierV1,
},
display_names::UnitsDisplayNames,
},
measure::measureunit::MeasureUnit,
};
pub mod area;
pub mod duration;
pub mod length;
pub mod mass;
pub mod volume;
pub trait MeasureUnitCategory {
type DataMarkerCore: DynamicDataMarker<DataStruct = UnitsDisplayNames<'static>> + DataMarker;
type DataMarkerExtended: DynamicDataMarker<DataStruct = UnitsDisplayNames<'static>> + DataMarker;
type DataMarkerOutlier: DynamicDataMarker<DataStruct = UnitsDisplayNames<'static>> + DataMarker;
}
#[derive(Debug)]
pub struct CategorizedMeasureUnit<T: MeasureUnitCategory> {
_category: PhantomData<T>,
pub unit: MeasureUnit,
}
impl<T: MeasureUnitCategory> CategorizedMeasureUnit<T> {
pub fn cldr_id(&self) -> &str {
match self.unit.id {
Some(id) => id,
None => unimplemented!(),
}
}
}
#[derive(Debug)]
#[non_exhaustive]
pub struct Area;
#[derive(Debug)]
#[non_exhaustive]
pub struct Duration;
#[derive(Debug)]
#[non_exhaustive]
pub struct Length;
#[derive(Debug)]
#[non_exhaustive]
pub struct Mass;
#[derive(Debug)]
#[non_exhaustive]
pub struct Volume;
impl MeasureUnitCategory for Area {
type DataMarkerCore = UnitsNamesAreaCoreV1;
type DataMarkerExtended = UnitsNamesAreaExtendedV1;
type DataMarkerOutlier = UnitsNamesAreaOutlierV1;
}
impl MeasureUnitCategory for Duration {
type DataMarkerCore = UnitsNamesDurationCoreV1;
type DataMarkerExtended = UnitsNamesDurationExtendedV1;
type DataMarkerOutlier = UnitsNamesDurationOutlierV1;
}
impl MeasureUnitCategory for Length {
type DataMarkerCore = UnitsNamesLengthCoreV1;
type DataMarkerExtended = UnitsNamesLengthExtendedV1;
type DataMarkerOutlier = UnitsNamesLengthOutlierV1;
}
impl MeasureUnitCategory for Mass {
type DataMarkerCore = UnitsNamesMassCoreV1;
type DataMarkerExtended = UnitsNamesMassExtendedV1;
type DataMarkerOutlier = UnitsNamesMassOutlierV1;
}
impl MeasureUnitCategory for Volume {
type DataMarkerCore = UnitsNamesVolumeCoreV1;
type DataMarkerExtended = UnitsNamesVolumeExtendedV1;
type DataMarkerOutlier = UnitsNamesVolumeOutlierV1;
}