use super::data_conversion_target::DataConversionTarget;
use super::data_converter::DataConverter;
use super::error::{
DataConversionError,
DataListConversionError,
};
use super::options::DataConversionOptions;
#[must_use]
#[derive(Debug, Clone)]
pub struct DataConverters<I> {
sources: I,
}
impl<I> DataConverters<I>
where
I: Iterator,
{
#[inline(always)]
pub fn from_iterator(sources: I) -> Self {
Self { sources }
}
}
impl<I> DataConverters<I>
where
I: Iterator,
{
#[inline(always)]
pub fn to_vec<'a, T>(self) -> Result<Vec<T>, DataListConversionError>
where
I::Item: Into<DataConverter<'a>>,
T: DataConversionTarget,
{
self.to_vec_with(DataConversionOptions::default_ref())
}
pub fn to_vec_with<'a, T>(
self,
options: &DataConversionOptions,
) -> Result<Vec<T>, DataListConversionError>
where
I::Item: Into<DataConverter<'a>>,
T: DataConversionTarget,
{
let sources = self.sources;
let mut converted = Vec::new();
for (index, source) in sources.enumerate() {
let value = match source.into().into_target_with::<T>(options) {
Ok(value) => value,
Err(source) => {
return Err(DataListConversionError::new(index, source));
}
};
converted.push(value);
}
Ok(converted)
}
#[inline(always)]
pub fn to_first<'a, T>(self) -> Result<T, DataConversionError>
where
I::Item: Into<DataConverter<'a>>,
T: DataConversionTarget,
{
self.to_first_with(DataConversionOptions::default_ref())
}
pub fn to_first_with<'a, T>(
self,
options: &DataConversionOptions,
) -> Result<T, DataConversionError>
where
I::Item: Into<DataConverter<'a>>,
T: DataConversionTarget,
{
let mut sources = self.sources;
match sources.next() {
Some(source) => source.into().into_target_with::<T>(options),
None => Err(DataConversionError::empty_collection(T::DATA_TYPE)),
}
}
}
impl<I> DataConverters<I>
where
I: ExactSizeIterator,
{
#[must_use]
#[inline(always)]
pub fn len(&self) -> usize {
self.sources.len()
}
#[must_use]
#[inline(always)]
pub fn is_empty(&self) -> bool {
self.sources.len() == 0
}
}
impl<'a, V> From<&'a [V]> for DataConverters<std::slice::Iter<'a, V>> {
#[inline(always)]
fn from(values: &'a [V]) -> Self {
Self::from_iterator(values.iter())
}
}
impl<'a, V> From<&'a Vec<V>> for DataConverters<std::slice::Iter<'a, V>> {
#[inline(always)]
fn from(values: &'a Vec<V>) -> Self {
Self::from(values.as_slice())
}
}
impl<V> From<Vec<V>> for DataConverters<std::vec::IntoIter<V>> {
#[inline(always)]
fn from(values: Vec<V>) -> Self {
Self::from_iterator(values.into_iter())
}
}