use std::collections::HashMap;
#[cfg(feature = "serde")]
use std::fmt::Debug;
#[cfg(feature = "serde")]
use super::errors::IdentifiedVecOfSerdeFailure;
use crate::{ConflictResolutionChoice, IdentifiedVec, IsIdentifiedVec, IsIdentifiedVecOf};
#[cfg(feature = "serde")]
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
use super::identifiable_trait::Identifiable;
pub type IdentifiedVecOf<Element> = IdentifiedVec<<Element as Identifiable>::ID, Element>;
impl<Element> IsIdentifiedVecOf<Element> for IdentifiedVecOf<Element>
where
Element: Identifiable,
{
fn new() -> Self {
Self {
order: Vec::new(),
elements: HashMap::new(),
_id_of_element: |i| i.id(),
}
}
#[inline]
fn from_iter<It>(unique_elements: It) -> Self
where
It: IntoIterator<Item = Element>,
{
let mut _self = Self::new();
unique_elements
.into_iter()
.for_each(|e| _ = _self.append(e));
return _self;
}
#[inline]
fn try_from_iter_select_unique_with<E, I>(
elements: I,
combine: fn((usize, &Element, &Element)) -> Result<ConflictResolutionChoice, E>,
) -> Result<Self, E>
where
I: IntoIterator<Item = Element>,
{
Self::try_from_iter_select_unique_ids_with(elements, |e| e.id(), combine)
}
#[inline]
fn from_iter_select_unique_with<I>(
elements: I,
combine: fn((usize, &Element, &Element)) -> ConflictResolutionChoice,
) -> Self
where
I: IntoIterator<Item = Element>,
{
Self::from_iter_select_unique_ids_with(elements, |e| e.id(), combine)
}
}
#[cfg(feature = "serde")]
impl<Element> Serialize for IdentifiedVecOf<Element>
where
Element: Serialize + Identifiable + Debug + Clone,
{
fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where
S: Serializer,
{
Vec::serialize(&self.elements(), serializer)
}
}
#[cfg(feature = "serde")]
impl<'de, Element> Deserialize<'de> for IdentifiedVecOf<Element>
where
Element: Deserialize<'de> + Identifiable + Debug + Clone,
{
#[cfg(not(tarpaulin_include))] fn deserialize<D: Deserializer<'de>>(
deserializer: D,
) -> Result<IdentifiedVecOf<Element>, D::Error> {
let elements = Vec::<Element>::deserialize(deserializer)?;
IdentifiedVecOf::<Element>::try_from_iter_select_unique_with(elements, |(idx, _, _)| {
Err(IdentifiedVecOfSerdeFailure::DuplicateElementsAtIndex(idx))
})
.map_err(de::Error::custom)
}
}