use std::marker::PhantomData;
use super::data_conversion_error::DataConversionError;
use super::data_conversion_options::DataConversionOptions;
use super::data_conversion_result::DataConversionResult;
use super::data_convert_to::DataConvertTo;
use super::data_converter::DataConverter;
use super::data_list_conversion_error::DataListConversionError;
use super::data_list_conversion_result::DataListConversionResult;
#[derive(Debug, Clone)]
pub struct DataConverters<'a, I> {
sources: I,
marker: PhantomData<&'a ()>,
}
impl<'a, I> DataConverters<'a, I>
where
I: Iterator,
{
#[inline]
pub fn from_iterator(sources: I) -> Self {
Self {
sources,
marker: PhantomData,
}
}
}
impl<'a, I> DataConverters<'a, I>
where
I: Iterator,
I::Item: Into<DataConverter<'a>>,
{
pub fn to_vec<T>(self) -> DataListConversionResult<Vec<T>>
where
DataConverter<'a>: DataConvertTo<T>,
{
self.to_vec_with(&DataConversionOptions::default())
}
pub fn to_vec_with<T>(self, options: &DataConversionOptions) -> DataListConversionResult<Vec<T>>
where
DataConverter<'a>: DataConvertTo<T>,
{
let sources = self.sources;
let (capacity, _) = sources.size_hint();
let mut converted = Vec::with_capacity(capacity);
for (index, source) in sources.enumerate() {
let value = match source.into().to_with::<T>(options) {
Ok(value) => value,
Err(source) => {
return Err(DataListConversionError { index, source });
}
};
converted.push(value);
}
Ok(converted)
}
pub fn to_first<T>(self) -> DataConversionResult<T>
where
DataConverter<'a>: DataConvertTo<T>,
{
self.to_first_with(&DataConversionOptions::default())
}
pub fn to_first_with<T>(self, options: &DataConversionOptions) -> DataConversionResult<T>
where
DataConverter<'a>: DataConvertTo<T>,
{
let mut sources = self.sources;
match sources.next() {
Some(source) => source.into().to_with::<T>(options),
None => Err(DataConversionError::NoValue),
}
}
}
impl<'a, I> DataConverters<'a, I>
where
I: ExactSizeIterator,
{
#[inline]
pub fn len(&self) -> usize {
self.sources.len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.sources.len() == 0
}
}
impl<'a, V> From<&'a [V]> for DataConverters<'a, std::slice::Iter<'a, V>>
where
&'a V: Into<DataConverter<'a>>,
{
#[inline]
fn from(values: &'a [V]) -> Self {
Self::from_iterator(values.iter())
}
}
impl<'a, V> From<&'a Vec<V>> for DataConverters<'a, std::slice::Iter<'a, V>>
where
&'a V: Into<DataConverter<'a>>,
{
#[inline]
fn from(values: &'a Vec<V>) -> Self {
Self::from(values.as_slice())
}
}
impl<V> From<Vec<V>> for DataConverters<'static, std::vec::IntoIter<V>>
where
V: Into<DataConverter<'static>>,
{
#[inline]
fn from(values: Vec<V>) -> Self {
Self::from_iterator(values.into_iter())
}
}