use std::fmt;
pub mod lspci;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct MultiView<T, V> {
pub data: T,
pub view: V,
}
pub trait DisplayMultiView<V>: Sized {
fn display(&self, view: V) -> MultiView<&Self, V> {
MultiView { data: self, view }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum BoolView {
CheckMark,
PlusMinus,
Str(&'static str),
}
impl DisplayMultiView<BoolView> for bool {}
impl<'a> fmt::Display for MultiView<&'a bool, BoolView> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match (self.data, self.view) {
(false, BoolView::CheckMark) => write!(f, "✗"),
(true, BoolView::CheckMark) => write!(f, "✓"),
(false, BoolView::PlusMinus) => write!(f, "-"),
(true, BoolView::PlusMinus) => write!(f, "+"),
(true, BoolView::Str(s)) => write!(f, "{}", s),
_ => Ok(()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use pretty_assertions::assert_eq;
#[test]
fn display_multiview_bool() {
assert_eq!("✓", (true).display(BoolView::CheckMark).to_string());
assert_eq!("✗", (false).display(BoolView::CheckMark).to_string());
assert_eq!("+", (true).display(BoolView::PlusMinus).to_string());
assert_eq!("-", (false).display(BoolView::PlusMinus).to_string());
}
}