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

Commit

Permalink
Merge pull request #287 from dtolnay/debug
Browse files Browse the repository at this point in the history
Handwrite a better Debug for Value
  • Loading branch information
dtolnay committed Jul 28, 2022
2 parents f667c2e + cdb5036 commit 83a5cec
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 1 deletion.
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);
}

0 comments on commit 83a5cec

Please sign in to comment.