use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(untagged)]
pub enum OneOrMany<T> {
One(T),
Many(Vec<T>),
}
impl<T> OneOrMany<T> {
pub fn iter(&self) -> impl Iterator<Item = &T> {
match self {
Self::One(one) => core::slice::from_ref(one).iter(),
Self::Many(many) => many.iter(),
}
}
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> {
match self {
Self::One(one) => core::slice::from_mut(one).iter_mut(),
Self::Many(many) => many.iter_mut(),
}
}
pub fn len(&self) -> usize {
match self {
Self::One(_) => 1,
Self::Many(many) => many.len(),
}
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn first(&self) -> Option<&T> {
self.iter().next()
}
pub fn contains(&self, value: &T) -> bool
where
T: PartialEq,
{
self.iter().any(|v| v == value)
}
pub fn into_vec(self) -> Vec<T> {
match self {
Self::One(one) => vec![one],
Self::Many(many) => many,
}
}
}
impl<T> From<T> for OneOrMany<T> {
fn from(value: T) -> Self {
Self::One(value)
}
}
impl<T> From<Vec<T>> for OneOrMany<T> {
fn from(values: Vec<T>) -> Self {
Self::Many(values)
}
}
impl From<&str> for OneOrMany<String> {
fn from(value: &str) -> Self {
Self::One(value.to_owned())
}
}