use crate::mapping::Mapping;
use crate::value::{Number, Value};
use std::fmt::{self, Debug, Display};
impl Debug for Value {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
match self {
Value::Null => formatter.write_str("Null"),
Value::Bool(boolean) => write!(formatter, "Bool({})", boolean),
Value::Number(number) => write!(formatter, "Number({})", number),
Value::String(string) => write!(formatter, "String({:?})", string),
Value::Sequence(sequence) => {
formatter.write_str("Sequence ")?;
formatter.debug_list().entries(sequence).finish()
}
Value::Mapping(mapping) => Debug::fmt(mapping, formatter),
Value::Tagged(tagged) => Debug::fmt(tagged, formatter),
}
}
}
struct DisplayNumber<'a>(&'a Number);
impl<'a> Debug for DisplayNumber<'a> {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
Display::fmt(self.0, formatter)
}
}
impl Debug for Number {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "Number({})", self)
}
}
impl Debug for Mapping {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("Mapping ")?;
let mut debug = formatter.debug_map();
for (k, v) in self {
let tmp;
debug.entry(
match k {
Value::Bool(boolean) => boolean,
Value::Number(number) => {
tmp = DisplayNumber(number);
&tmp
}
Value::String(string) => string,
_ => k,
},
v,
);
}
debug.finish()
}
}