difftreelog
feat preserve object field order
in: trunk
5 files changed
crates/nixlike/Cargo.tomldiffbeforeafterboth--- 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"
crates/nixlike/src/de_impl.rsdiffbeforeafterboth--- 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<String, Value>,
+ iter: linked_hash_map::IntoIter<String, Value>,
value: Option<Value>,
}
impl ObjectAccess {
- fn new(v: BTreeMap<String, Value>) -> Self {
+ fn new(v: LinkedHashMap<String, Value>) -> Self {
Self {
iter: v.into_iter(),
value: None,
@@ -103,7 +101,7 @@
_ => Err(Error::Expected("array")),
}
}
- fn parse_object(self) -> Result<BTreeMap<String, Value>, Error> {
+ fn parse_object(self) -> Result<LinkedHashMap<String, Value>, Error> {
match self {
Value::Object(s) => Ok(s),
_ => Err(Error::Expected("object")),
crates/nixlike/src/lib.rsdiffbeforeafterboth--- 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<String, Value>),
+ Object(LinkedHashMap<String, Value>),
Array(Vec<Value>),
Null,
}
@@ -49,11 +48,11 @@
/ "false" {false} } / expected!("<boolean>")
rule indent() -> String
= quiet! { s:$(['a'..='z' | 'A'..='Z' | '0'..='9' | '_' | '-']+) { s.to_owned() } } / expected!("<identifier>")
- rule object() -> BTreeMap<String, Value>
+ rule object() -> LinkedHashMap<String, Value>
= "{" _
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) {
crates/nixlike/src/se_impl.rsdiffbeforeafterboth1use std::{collections::BTreeMap, convert::TryInto};1use std::convert::TryInto;223use linked_hash_map::LinkedHashMap;3use serde::{4use serde::{4 ser::{5 ser::{5 self, SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple,6 self, SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple,96 }97 }97}98}989999pub struct MySerializeMap(BTreeMap<String, Value>, Option<String>);100pub struct MySerializeMap(LinkedHashMap<String, Value>, Option<String>);100101101impl SerializeMap for MySerializeMap {102impl SerializeMap for MySerializeMap {102 type Ok = Value;103 type Ok = Value;127 }128 }128}129}129130130pub struct MySerializeStruct(BTreeMap<String, Value>);131pub struct MySerializeStruct(LinkedHashMap<String, Value>);131132132impl SerializeStruct for MySerializeStruct {133impl SerializeStruct for MySerializeStruct {133 type Ok = Value;134 type Ok = Value;147 }148 }148}149}149150150pub struct MySerializeStructVariant(String, BTreeMap<String, Value>);151pub struct MySerializeStructVariant(String, LinkedHashMap<String, Value>);151152152impl SerializeStructVariant for MySerializeStructVariant {153impl SerializeStructVariant for MySerializeStructVariant {153 type Ok = Value;154 type Ok = Value;336 }337 }337338338 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {339 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {339 Ok(MySerializeMap(BTreeMap::new(), None))340 Ok(MySerializeMap(LinkedHashMap::new(), None))340 }341 }341342342 fn serialize_struct(343 fn serialize_struct(343 self,344 self,344 _name: &'static str,345 _name: &'static str,345 _len: usize,346 _len: usize,346 ) -> Result<Self::SerializeStruct, Self::Error> {347 ) -> Result<Self::SerializeStruct, Self::Error> {347 Ok(MySerializeStruct(BTreeMap::new()))348 Ok(MySerializeStruct(LinkedHashMap::new()))348 }349 }349350350 fn serialize_struct_variant(351 fn serialize_struct_variant(356 ) -> Result<Self::SerializeStructVariant, Self::Error> {357 ) -> Result<Self::SerializeStructVariant, Self::Error> {357 Ok(MySerializeStructVariant(358 Ok(MySerializeStructVariant(358 variant.to_owned(),359 variant.to_owned(),359 BTreeMap::new(),360 LinkedHashMap::new(),360 ))361 ))361 }362 }362}363}crates/nixlike/src/to_string.rsdiffbeforeafterboth--- 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(),
));