use alloc::{
slice::{from_ref, Iter},
vec,
vec::Vec,
};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
#[serde(untagged)]
pub enum InlineList<T> {
List(Vec<T>),
Inline(T),
}
impl<T> InlineList<T> {
pub fn iter(&self) -> Iter<'_, T> {
match self {
Self::List(v) => v.iter(),
Self::Inline(e) => from_ref(e).iter(),
}
}
pub fn len(&self) -> usize {
match self {
Self::List(v) => v.len(),
Self::Inline(_) => 1,
}
}
pub fn is_empty(&self) -> bool {
match self {
Self::List(v) => v.is_empty(),
Self::Inline(_) => false,
}
}
pub fn is_single(&self) -> bool {
match self {
Self::List(v) => v.len() == 1,
Self::Inline(_) => true,
}
}
}
impl<T> IntoIterator for InlineList<T> {
type Item = T;
type IntoIter = <Vec<T> as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
match self {
Self::List(v) => v.into_iter(),
Self::Inline(e) => vec![e].into_iter(),
}
}
}
impl<T> Default for InlineList<T> {
fn default() -> Self {
Self::List(Vec::new())
}
}