Always preserve order
This commit is contained in:
parent
562eed85a4
commit
316eecbbdc
4 changed files with 21 additions and 21 deletions
|
@ -8,9 +8,6 @@ license = "MIT/Apache-2.0"
|
||||||
description = "The missing YAML 1.2 parser for rust"
|
description = "The missing YAML 1.2 parser for rust"
|
||||||
repository = "https://github.com/chyh1990/yaml-rust"
|
repository = "https://github.com/chyh1990/yaml-rust"
|
||||||
|
|
||||||
[features]
|
|
||||||
preserve_order = ["linked-hash-map"]
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clippy = { version = "^0.*", optional = true }
|
clippy = { version = "^0.*", optional = true }
|
||||||
linked-hash-map = { version = ">=0.0.9, <0.4", optional = true }
|
linked-hash-map = ">=0.0.9, <0.4"
|
||||||
|
|
|
@ -278,7 +278,6 @@ fn need_quotes(string: &str) -> bool {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use yaml::*;
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_emit_simple() {
|
fn test_emit_simple() {
|
||||||
|
|
|
@ -42,7 +42,6 @@
|
||||||
#![cfg_attr(feature="clippy", warn(cyclomatic_complexity))]
|
#![cfg_attr(feature="clippy", warn(cyclomatic_complexity))]
|
||||||
#![cfg_attr(feature="clippy", allow(match_same_arms))]
|
#![cfg_attr(feature="clippy", allow(match_same_arms))]
|
||||||
|
|
||||||
#[cfg(feature = "preserve_order")]
|
|
||||||
extern crate linked_hash_map;
|
extern crate linked_hash_map;
|
||||||
|
|
||||||
pub mod yaml;
|
pub mod yaml;
|
||||||
|
|
|
@ -2,11 +2,11 @@ use std::collections::BTreeMap;
|
||||||
use std::ops::Index;
|
use std::ops::Index;
|
||||||
use std::string;
|
use std::string;
|
||||||
use std::i64;
|
use std::i64;
|
||||||
use std::str::FromStr;
|
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::vec;
|
use std::vec;
|
||||||
use parser::*;
|
use parser::*;
|
||||||
use scanner::{TScalarStyle, ScanError, TokenType, Marker};
|
use scanner::{TScalarStyle, ScanError, TokenType, Marker};
|
||||||
|
use linked_hash_map::LinkedHashMap;
|
||||||
|
|
||||||
/// A YAML node is stored as this `Yaml` enumeration, which provides an easy way to
|
/// A YAML node is stored as this `Yaml` enumeration, which provides an easy way to
|
||||||
/// access your YAML document.
|
/// access your YAML document.
|
||||||
|
@ -37,16 +37,9 @@ pub enum Yaml {
|
||||||
Boolean(bool),
|
Boolean(bool),
|
||||||
/// YAML array, can be accessed as a `Vec`.
|
/// YAML array, can be accessed as a `Vec`.
|
||||||
Array(self::Array),
|
Array(self::Array),
|
||||||
/// YAML hash, can be accessed as a `BTreeMap`.
|
/// YAML hash, can be accessed as a `LinkedHashMap`.
|
||||||
///
|
///
|
||||||
/// If the order of keys is meaningful, enable the `preserve_order` feature to
|
/// Itertion order will match the order of insertion into the map.
|
||||||
/// store hashes as a `LinkedHashMap` intead of `BTreeMap`. When using a
|
|
||||||
/// `LinkedHashMap`, the itertion order will match the order of insertion into
|
|
||||||
/// the map.
|
|
||||||
///
|
|
||||||
/// ```toml
|
|
||||||
/// yaml-rust = { version = "*", features = ["preserve_order"] }
|
|
||||||
/// ```
|
|
||||||
Hash(self::Hash),
|
Hash(self::Hash),
|
||||||
/// Alias, not fully supported yet.
|
/// Alias, not fully supported yet.
|
||||||
Alias(usize),
|
Alias(usize),
|
||||||
|
@ -59,11 +52,7 @@ pub enum Yaml {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type Array = Vec<Yaml>;
|
pub type Array = Vec<Yaml>;
|
||||||
|
pub type Hash = LinkedHashMap<Yaml, Yaml>;
|
||||||
#[cfg(not(feature = "preserve_order"))]
|
|
||||||
pub type Hash = BTreeMap<Yaml, Yaml>;
|
|
||||||
#[cfg(feature = "preserve_order")]
|
|
||||||
pub type Hash = ::linked_hash_map::LinkedHashMap<Yaml, Yaml>;
|
|
||||||
|
|
||||||
pub struct YamlLoader {
|
pub struct YamlLoader {
|
||||||
docs: Vec<Yaml>,
|
docs: Vec<Yaml>,
|
||||||
|
@ -587,4 +576,20 @@ a1: &DEFAULT
|
||||||
assert_eq!(doc.next().unwrap().into_i64().unwrap(), 63);
|
assert_eq!(doc.next().unwrap().into_i64().unwrap(), 63);
|
||||||
assert_eq!(doc.next().unwrap().into_i64().unwrap(), 12345);
|
assert_eq!(doc.next().unwrap().into_i64().unwrap(), 12345);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_hash_order() {
|
||||||
|
let s = "---
|
||||||
|
b: ~
|
||||||
|
a: ~
|
||||||
|
c: ~
|
||||||
|
";
|
||||||
|
let out = YamlLoader::load_from_str(&s).unwrap();
|
||||||
|
let first = out.into_iter().next().unwrap();
|
||||||
|
let mut iter = first.into_hash().unwrap().into_iter();
|
||||||
|
assert_eq!(Some((Yaml::String("b".to_owned()), Yaml::Null)), iter.next());
|
||||||
|
assert_eq!(Some((Yaml::String("a".to_owned()), Yaml::Null)), iter.next());
|
||||||
|
assert_eq!(Some((Yaml::String("c".to_owned()), Yaml::Null)), iter.next());
|
||||||
|
assert_eq!(None, iter.next());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue