use crate::models::quote::FormattedValue;
mod sealed {
pub trait Sealed {}
}
pub trait Format: sealed::Sealed + Clone + std::fmt::Debug + PartialEq + 'static {
type Value<T: Clone + std::fmt::Debug + PartialEq + serde::Serialize + for<'de> serde::Deserialize<'de>>: Clone
+ std::fmt::Debug
+ PartialEq
+ serde::Serialize
+ for<'de> serde::Deserialize<'de>;
fn raw_from<
T: Clone + std::fmt::Debug + PartialEq + serde::Serialize + for<'de> serde::Deserialize<'de>,
>(
value: &Self::Value<T>,
) -> Option<T>;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct Both;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Raw;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Pretty;
impl sealed::Sealed for Both {}
impl sealed::Sealed for Raw {}
impl sealed::Sealed for Pretty {}
impl Format for Both {
type Value<
T: Clone + std::fmt::Debug + PartialEq + serde::Serialize + for<'de> serde::Deserialize<'de>,
> = FormattedValue<T>;
fn raw_from<
T: Clone + std::fmt::Debug + PartialEq + serde::Serialize + for<'de> serde::Deserialize<'de>,
>(
value: &FormattedValue<T>,
) -> Option<T> {
value.raw.clone()
}
}
impl Format for Raw {
type Value<
T: Clone + std::fmt::Debug + PartialEq + serde::Serialize + for<'de> serde::Deserialize<'de>,
> = T;
fn raw_from<
T: Clone + std::fmt::Debug + PartialEq + serde::Serialize + for<'de> serde::Deserialize<'de>,
>(
value: &T,
) -> Option<T> {
Some(value.clone())
}
}
impl Format for Pretty {
type Value<
T: Clone + std::fmt::Debug + PartialEq + serde::Serialize + for<'de> serde::Deserialize<'de>,
> = String;
fn raw_from<
T: Clone + std::fmt::Debug + PartialEq + serde::Serialize + for<'de> serde::Deserialize<'de>,
>(
_value: &String,
) -> Option<T> {
None
}
}