use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(untagged)]
pub enum OneOrMany<T: Clone> {
Many(Vec<T>),
One(T),
}
impl<T: Clone> OneOrMany<T> {
pub fn into_vec(self) -> Vec<T> {
match self {
OneOrMany::One(item) => vec![item],
OneOrMany::Many(items) => items,
}
}
pub fn as_vec(&self) -> Vec<&T> {
match self {
OneOrMany::One(item) => vec![item],
OneOrMany::Many(items) => items.iter().collect(),
}
}
pub fn to_vec(&self) -> Vec<T> {
match self {
OneOrMany::One(item) => vec![item.clone()],
OneOrMany::Many(items) => items.to_vec(),
}
}
pub fn len(&self) -> usize {
match self {
OneOrMany::One(_) => 1,
OneOrMany::Many(items) => items.len(),
}
}
pub fn is_empty(&self) -> bool {
match self {
OneOrMany::One(_) => false,
OneOrMany::Many(items) => items.is_empty(),
}
}
pub fn iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
match self {
OneOrMany::One(item) => Box::new(std::iter::once(item)),
OneOrMany::Many(items) => Box::new(items.iter()),
}
}
}