You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
995 B
40 lines
995 B
use crate::{messaging::AsMsg, utils::OneOrVec}; |
|
use serde::{Deserialize, Serialize}; |
|
use std::fmt::{self, Display, Formatter}; |
|
use std::ops::{Deref, DerefMut}; |
|
|
|
#[derive(Serialize, Deserialize, Clone, Default)] |
|
pub struct VecDisplay<T: AsMsg + Display>(pub Vec<T>); |
|
|
|
impl<T: AsMsg + Display> VecDisplay<T> { |
|
pub fn new(inner: impl OneOrVec<T>) -> Self { |
|
VecDisplay(inner.into_vec()) |
|
} |
|
|
|
pub fn into_builtin_vec(self) -> Vec<T> { |
|
self.0 |
|
} |
|
} |
|
|
|
impl<T: AsMsg + Display> Deref for VecDisplay<T> { |
|
type Target = Vec<T>; |
|
|
|
fn deref(&self) -> &Self::Target { |
|
&self.0 |
|
} |
|
} |
|
|
|
impl<T: AsMsg + Display> DerefMut for VecDisplay<T> { |
|
fn deref_mut(&mut self) -> &mut Self::Target { |
|
&mut self.0 |
|
} |
|
} |
|
|
|
impl<T: AsMsg + Display> Display for VecDisplay<T> { |
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { |
|
for (i, itm) in self.0.iter().enumerate() { |
|
writeln!(f, "### {}:\n{}\n", i, itm)?; |
|
} |
|
Ok(()) |
|
} |
|
}
|
|
|