xsd_parser/types/
helper.rsuse std::ops::DerefMut;
use super::{AttributeInfo, ElementInfo, Ident, VariantInfo};
pub trait WithIdent {
fn ident(&self) -> &Ident;
}
impl WithIdent for VariantInfo {
fn ident(&self) -> &Ident {
&self.ident
}
}
impl WithIdent for ElementInfo {
fn ident(&self) -> &Ident {
&self.ident
}
}
impl WithIdent for AttributeInfo {
fn ident(&self) -> &Ident {
&self.ident
}
}
pub trait VecHelper {
type Item;
fn find(&mut self, ident: Ident) -> Option<&mut Self::Item>;
fn find_or_insert<F>(&mut self, ident: Ident, f: F) -> &mut Self::Item
where
F: FnOnce(Ident) -> Self::Item;
}
impl<X, T> VecHelper for X
where
X: DerefMut<Target = Vec<T>>,
T: WithIdent,
{
type Item = T;
fn find(&mut self, ident: Ident) -> Option<&mut Self::Item> {
self.iter_mut().find(|x| x.ident() == &ident)
}
fn find_or_insert<F>(&mut self, ident: Ident, f: F) -> &mut Self::Item
where
F: FnOnce(Ident) -> Self::Item,
{
let vec = &mut **self;
if let Some(i) = vec.iter().position(|x| x.ident() == &ident) {
&mut vec[i]
} else {
vec.push(f(ident));
vec.last_mut().unwrap()
}
}
}