use std::fmt::Display;
use super::*;
impl<A: Display> Display for WithLengthAndWidth<A> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.value())
}
}
impl Display for RenderedAny {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Common(common) => write!(f, "{}", common),
Self::Wide(vec) => write!(f, "( {} )", RenderVec(vec)),
Self::Long(vec) => write!(f, "( {} )", RenderVec(vec)),
}
}
}
impl Display for RenderedCommon {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Empty => write!(f, "."),
Self::Resolution => write!(f, "?"),
Self::Event(event) => write!(f, "{}", event),
Self::Action { name, rendered } => write!(f, "{} @ {}", name, rendered),
}
}
}
struct RenderVec<T>(T);
impl Display for RenderVec<&Vec<WithLengthAndWidth<RenderedWide>>> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut delimiter = "";
let mut tail = "~";
for rendered in self.0 {
write!(f, "{}{}", delimiter, rendered)?;
delimiter = " > ";
tail = "";
}
write!(f, "{}", tail)
}
}
impl Display for RenderVec<&Vec<WithLengthAndWidth<RenderedLong>>> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut delimiter = "";
let mut tail = "~";
for rendered in self.0 {
write!(f, "{}{}", delimiter, rendered)?;
delimiter = " | ";
tail = "";
}
write!(f, "{}", tail)
}
}
impl Display for RenderedLong {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Common(common) => write!(f, "{}", common),
Self::Long(vec) => write!(f, "( {} )", RenderVec(vec)),
}
}
}
impl Display for RenderedWide {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Common(common) => write!(f, "{}", common),
Self::Wide(vec) => write!(f, "( {} )", RenderVec(vec)),
}
}
}