Skip to content
This repository has been archived by the owner on Mar 25, 2024. It is now read-only.

Handwrite a better Debug for Value #287

Merged
merged 3 commits into from Jul 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
46 changes: 46 additions & 0 deletions src/value/debug.rs
@@ -0,0 +1,46 @@
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) => {
formatter.write_str("Mapping ")?;
let mut debug = formatter.debug_map();
for (k, v) in mapping {
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()
}
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)
}
}
3 changes: 2 additions & 1 deletion src/value/mod.rs
@@ -1,6 +1,7 @@
//! The Value enum, a loosely typed way of representing any valid YAML value.

mod de;
mod debug;
mod from;
mod index;
mod partial_eq;
Expand All @@ -20,7 +21,7 @@ pub use self::tagged::{Tag, TaggedValue};
pub use crate::number::Number;

/// Represents any valid YAML value.
#[derive(Clone, PartialEq, PartialOrd, Debug)]
#[derive(Clone, PartialEq, PartialOrd)]
pub enum Value {
/// Represents a YAML null value.
Null,
Expand Down
38 changes: 38 additions & 0 deletions tests/test_value.rs
Expand Up @@ -93,3 +93,41 @@ fn test_merge() {
assert_eq!(value[4], value[i]);
}
}

#[test]
fn test_debug() {
let yaml = indoc! {"
Null: ~
Bool: true
Number: 1
String: ...
Sequence:
- true
EmptySequence: []
EmptyMapping: {}
Tagged: !tag true
"};

let value: Value = serde_yaml::from_str(yaml).unwrap();
let debug = format!("{:#?}", value);

let expected = indoc! {r#"
Mapping {
"Null": Null,
"Bool": Bool(true),
"Number": Number(1),
"String": String("..."),
"Sequence": Sequence [
Bool(true),
],
"EmptySequence": Sequence [],
"EmptyMapping": Mapping {},
"Tagged": TaggedValue {
tag: !tag,
value: Bool(true),
},
}"#
};

assert_eq!(debug, expected);
}