--- a/crates/nixlike/Cargo.toml +++ b/crates/nixlike/Cargo.toml @@ -8,6 +8,7 @@ [dependencies] anyhow = "1.0.44" dprint-core = "0.46.2" +linked-hash-map = "0.5.4" peg = "0.7.0" serde = "1.0.130" serde_json = "1.0.68" --- a/crates/nixlike/src/de_impl.rs +++ b/crates/nixlike/src/de_impl.rs @@ -1,8 +1,6 @@ -use std::{ - collections::BTreeMap, - convert::{TryFrom, TryInto}, -}; +use std::convert::{TryFrom, TryInto}; +use linked_hash_map::LinkedHashMap; use serde::{ de::{self, MapAccess, SeqAccess}, Deserializer, @@ -11,11 +9,11 @@ use crate::{Error, Value}; struct ObjectAccess { - iter: std::collections::btree_map::IntoIter, + iter: linked_hash_map::IntoIter, value: Option, } impl ObjectAccess { - fn new(v: BTreeMap) -> Self { + fn new(v: LinkedHashMap) -> Self { Self { iter: v.into_iter(), value: None, @@ -103,7 +101,7 @@ _ => Err(Error::Expected("array")), } } - fn parse_object(self) -> Result, Error> { + fn parse_object(self) -> Result, Error> { match self { Value::Object(s) => Ok(s), _ => Err(Error::Expected("object")), --- a/crates/nixlike/src/lib.rs +++ b/crates/nixlike/src/lib.rs @@ -1,5 +1,4 @@ -use std::collections::BTreeMap; - +use linked_hash_map::LinkedHashMap; use peg::str::LineCol; use se_impl::MySerialize; use serde::{Deserialize, Serialize}; @@ -29,7 +28,7 @@ Number(i64), String(String), Boolean(bool), - Object(BTreeMap), + Object(LinkedHashMap), Array(Vec), Null, } @@ -49,11 +48,11 @@ / "false" {false} } / expected!("") rule indent() -> String = quiet! { s:$(['a'..='z' | 'A'..='Z' | '0'..='9' | '_' | '-']+) { s.to_owned() } } / expected!("") - rule object() -> BTreeMap + rule object() -> LinkedHashMap = "{" _ e:(k:indent()++(_ "." _) _ "=" _ v:value() _ ";" _ {(k, v)})* "}" {? - let mut out = BTreeMap::new(); + let mut out = LinkedHashMap::new(); for (k, v) in e { let mut map = &mut out; for v in k.iter().take(k.len() - 1) { --- a/crates/nixlike/src/se_impl.rs +++ b/crates/nixlike/src/se_impl.rs @@ -1,5 +1,6 @@ -use std::{collections::BTreeMap, convert::TryInto}; +use std::convert::TryInto; +use linked_hash_map::LinkedHashMap; use serde::{ ser::{ self, SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple, @@ -96,7 +97,7 @@ } } -pub struct MySerializeMap(BTreeMap, Option); +pub struct MySerializeMap(LinkedHashMap, Option); impl SerializeMap for MySerializeMap { type Ok = Value; @@ -127,7 +128,7 @@ } } -pub struct MySerializeStruct(BTreeMap); +pub struct MySerializeStruct(LinkedHashMap); impl SerializeStruct for MySerializeStruct { type Ok = Value; @@ -147,7 +148,7 @@ } } -pub struct MySerializeStructVariant(String, BTreeMap); +pub struct MySerializeStructVariant(String, LinkedHashMap); impl SerializeStructVariant for MySerializeStructVariant { type Ok = Value; @@ -336,7 +337,7 @@ } fn serialize_map(self, _len: Option) -> Result { - Ok(MySerializeMap(BTreeMap::new(), None)) + Ok(MySerializeMap(LinkedHashMap::new(), None)) } fn serialize_struct( @@ -344,7 +345,7 @@ _name: &'static str, _len: usize, ) -> Result { - Ok(MySerializeStruct(BTreeMap::new())) + Ok(MySerializeStruct(LinkedHashMap::new())) } fn serialize_struct_variant( @@ -356,7 +357,7 @@ ) -> Result { Ok(MySerializeStructVariant( variant.to_owned(), - BTreeMap::new(), + LinkedHashMap::new(), )) } } --- a/crates/nixlike/src/to_string.rs +++ b/crates/nixlike/src/to_string.rs @@ -41,7 +41,7 @@ out.push_signal(Signal::StartIndent); out.push_condition(conditions::if_true_or( "array start", - is_multiple_lines.clone(), + is_multiple_lines, Signal::NewLine.into(), Signal::SpaceOrNewLine.into(), )); @@ -49,7 +49,7 @@ write_nix_buf(item, out); out.push_condition(conditions::if_true_or( "element separator", - is_multiple_lines.clone(), + is_multiple_lines, Signal::NewLine.into(), Signal::SpaceOrNewLine.into(), )); @@ -73,7 +73,7 @@ out.push_signal(Signal::StartIndent); out.push_condition(conditions::if_true_or( "object start", - is_multiple_lines.clone(), + is_multiple_lines, Signal::NewLine.into(), Signal::SpaceOrNewLine.into(), )); @@ -81,7 +81,7 @@ write_nix_obj_key_buf(k, v, out); out.push_condition(conditions::if_true_or( "element separator", - is_multiple_lines.clone(), + is_multiple_lines, Signal::NewLine.into(), Signal::SpaceOrNewLine.into(), ));