use crate::{
MultiValues,
Value,
ValueError,
ValueResult,
};
mod sealed {
use super::{
MultiValues,
Value,
ValueError,
};
pub trait Sealed {}
impl<T> Sealed for T
where
for<'a> T: TryFrom<&'a Value, Error = ValueError>
+ TryFrom<&'a MultiValues, Error = ValueError>,
for<'a> Vec<T>: TryFrom<&'a MultiValues, Error = ValueError>,
{
}
}
pub trait StrictValueRead: Sized + sealed::Sealed {
#[doc(hidden)]
fn read_scalar(value: &Value) -> ValueResult<Self>;
#[doc(hidden)]
fn read_collection_first(values: &MultiValues) -> ValueResult<Self>;
#[doc(hidden)]
fn read_collection_list(values: &MultiValues) -> ValueResult<Vec<Self>>;
}
impl<T> StrictValueRead for T
where
for<'a> T: TryFrom<&'a Value, Error = ValueError>
+ TryFrom<&'a MultiValues, Error = ValueError>,
for<'a> Vec<T>: TryFrom<&'a MultiValues, Error = ValueError>,
{
#[inline(always)]
fn read_scalar(value: &Value) -> ValueResult<Self> {
value.get()
}
#[inline(always)]
fn read_collection_first(values: &MultiValues) -> ValueResult<Self> {
values.get_first()
}
#[inline(always)]
fn read_collection_list(values: &MultiValues) -> ValueResult<Vec<Self>> {
values.get()
}
}