diff options
Diffstat (limited to 'engine/src/util.rs')
| -rw-r--r-- | engine/src/util.rs | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/engine/src/util.rs b/engine/src/util.rs index bd69734..688778b 100644 --- a/engine/src/util.rs +++ b/engine/src/util.rs @@ -1,4 +1,4 @@ -use std::fmt::Debug; +use std::fmt::{Debug, Display}; use crate::ecs::util::VecExt; @@ -161,6 +161,49 @@ impl<T> OptionExt<T> for Option<T> } } +pub struct DisplaySlice<'a, Item> +{ + slice: &'a [Item], +} + +impl<'a, Item> DisplaySlice<'a, Item> +{ + pub fn new(slice: &'a [Item]) -> Self + { + Self { slice } + } +} + +impl<Item> Display for DisplaySlice<'_, Item> +where + Item: Display, +{ + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result + { + let Some(first_item) = self.slice.first() else { + return formatter.write_str("<empty>"); + }; + + write!(formatter, "{first_item}")?; + + if self.slice.len() == 1 { + return Ok(()); + } + + for item in &self.slice[1..self.slice.len() - 1] { + write!(formatter, ", {item}")?; + } + + let Some(last_item) = self.slice.last() else { + unreachable!(); + }; + + write!(formatter, " & {last_item}")?; + + Ok(()) + } +} + macro_rules! try_option { ($expr: expr) => { match $expr { |
