diff options
-rw-r--r-- | src/value.rs | 14 | ||||
-rw-r--r-- | tests/display-tricky.rs | 49 |
2 files changed, 55 insertions, 8 deletions
diff --git a/src/value.rs b/src/value.rs index 99e6d23..4d56023 100644 --- a/src/value.rs +++ b/src/value.rs @@ -366,21 +366,19 @@ impl ser::Serialize for Value { // Be sure to visit non-tables first (and also non // array-of-tables) as all keys must be emitted first. for (k, v) in t { - if !v.is_array() && !v.is_table() { - map.serialize_key(k)?; - map.serialize_value(v)?; + if !v.is_table() && !v.is_array() || + (v.as_array().map(|a| a.len() == 0).unwrap_or(false)) { + map.serialize_entry(k, v)?; } } for (k, v) in t { - if v.is_array() { - map.serialize_key(k)?; - map.serialize_value(v)?; + if v.as_array().map(|a| a.len() > 0).unwrap_or(false) { + map.serialize_entry(k, v)?; } } for (k, v) in t { if v.is_table() { - map.serialize_key(k)?; - map.serialize_value(v)?; + map.serialize_entry(k, v)?; } } map.end() diff --git a/tests/display-tricky.rs b/tests/display-tricky.rs new file mode 100644 index 0000000..069e0f9 --- /dev/null +++ b/tests/display-tricky.rs @@ -0,0 +1,49 @@ +extern crate toml; +#[macro_use] extern crate serde_derive; + +#[derive(Debug, Serialize, Deserialize)] +pub struct Recipe { + pub name: String, + pub description: Option<String>, + #[serde(default)] + pub modules: Vec<Modules>, + #[serde(default)] + pub packages: Vec<Packages> +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Modules { + pub name: String, + pub version: Option<String> +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Packages { + pub name: String, + pub version: Option<String> +} + +#[test] +fn both_ends() { + let recipe_works = toml::from_str::<Recipe>(r#" + name = "testing" + description = "example" + modules = [] + + [[packages]] + name = "base" + "#).unwrap(); + toml::to_string(&recipe_works).unwrap(); + + let recipe_fails = toml::from_str::<Recipe>(r#" + name = "testing" + description = "example" + packages = [] + + [[modules]] + name = "base" + "#).unwrap(); + + let recipe_toml = toml::Value::try_from(recipe_fails).unwrap(); + recipe_toml.to_string(); +} |