git.delta.rocks / jrsonnet / refs/commits / f48f507511e2

difftreelog

feat preserve object field order

Yaroslav Bolyukin2021-09-18parent: #fb6d303.patch.diff
in: trunk

5 files changed

modifiedcrates/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"
modifiedcrates/nixlike/src/de_impl.rsdiffbeforeafterboth
before · crates/nixlike/src/de_impl.rs
1use std::{2	collections::BTreeMap,3	convert::{TryFrom, TryInto},4};56use serde::{7	de::{self, MapAccess, SeqAccess},8	Deserializer,9};1011use crate::{Error, Value};1213struct ObjectAccess {14	iter: std::collections::btree_map::IntoIter<String, Value>,15	value: Option<Value>,16}17impl ObjectAccess {18	fn new(v: BTreeMap<String, Value>) -> Self {19		Self {20			iter: v.into_iter(),21			value: None,22		}23	}24}2526impl<'de> MapAccess<'de> for ObjectAccess {27	type Error = Error;2829	fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>30	where31		K: de::DeserializeSeed<'de>,32	{33		if let Some((k, v)) = self.iter.next() {34			let _ = self.value.insert(v);35			Ok(Some(seed.deserialize(Value::String(k))?))36		} else {37			Ok(None)38		}39	}4041	fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>42	where43		V: de::DeserializeSeed<'de>,44	{45		seed.deserialize(self.value.take().unwrap())46	}47}4849struct ArrayAccess {50	iter: std::vec::IntoIter<Value>,51}52impl ArrayAccess {53	fn new(v: Vec<Value>) -> Self {54		Self {55			iter: v.into_iter(),56		}57	}58}5960impl<'de> SeqAccess<'de> for ArrayAccess {61	type Error = Error;6263	fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>64	where65		T: de::DeserializeSeed<'de>,66	{67		if let Some(v) = self.iter.next() {68			Ok(Some(seed.deserialize(v)?))69		} else {70			Ok(None)71		}72	}73}7475impl Value {76	fn parse_int<T: TryFrom<i64>>(&self) -> Result<T, Error> {77		match self {78			Value::Number(n) => Ok((*n).try_into().map_err(|_| Error::BadNumber)?),79			_ => Err(Error::Expected("integer")),80		}81	}82	fn parse_boolean(self) -> Result<bool, Error> {83		match self {84			Value::Boolean(b) => Ok(b),85			_ => Err(Error::Expected("boolean")),86		}87	}88	pub fn parse_string(&self) -> Result<&str, Error> {89		match self {90			Value::String(s) => Ok(s),91			_ => Err(Error::Expected("string")),92		}93	}94	fn parse_char(self) -> Result<char, Error> {95		match self {96			Value::String(s) if s.chars().count() == 1 => Ok(s.chars().next().unwrap()),97			_ => Err(Error::Expected("char")),98		}99	}100	fn parse_array(self) -> Result<Vec<Value>, Error> {101		match self {102			Value::Array(s) => Ok(s),103			_ => Err(Error::Expected("array")),104		}105	}106	fn parse_object(self) -> Result<BTreeMap<String, Value>, Error> {107		match self {108			Value::Object(s) => Ok(s),109			_ => Err(Error::Expected("object")),110		}111	}112	fn parse_null(self) -> Result<(), Error> {113		match self {114			Value::Null => Ok(()),115			_ => Err(Error::Expected("null")),116		}117	}118}119120impl de::Error for Error {121	fn custom<T>(msg: T) -> Self122	where123		T: std::fmt::Display,124	{125		Self::Custom(format!("{}", msg))126	}127}128129impl<'de> Deserializer<'de> for Value {130	type Error = Error;131132	fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>133	where134		V: serde::de::Visitor<'de>,135	{136		match self {137			Value::Number(f) => visitor.visit_i64(f),138			Value::String(s) => visitor.visit_str(&s),139			Value::Boolean(b) => visitor.visit_bool(b),140			Value::Object(o) => visitor.visit_map(ObjectAccess::new(o)),141			Value::Array(a) => visitor.visit_seq(ArrayAccess::new(a)),142			Value::Null => visitor.visit_none(),143		}144	}145146	fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>147	where148		V: serde::de::Visitor<'de>,149	{150		visitor.visit_bool(self.parse_boolean()?)151	}152153	fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>154	where155		V: serde::de::Visitor<'de>,156	{157		visitor.visit_i8(self.parse_int()?)158	}159160	fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>161	where162		V: serde::de::Visitor<'de>,163	{164		visitor.visit_i16(self.parse_int()?)165	}166167	fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>168	where169		V: serde::de::Visitor<'de>,170	{171		visitor.visit_i32(self.parse_int()?)172	}173174	fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>175	where176		V: serde::de::Visitor<'de>,177	{178		visitor.visit_i64(self.parse_int()?)179	}180181	fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>182	where183		V: serde::de::Visitor<'de>,184	{185		visitor.visit_u8(self.parse_int()?)186	}187188	fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>189	where190		V: serde::de::Visitor<'de>,191	{192		visitor.visit_u16(self.parse_int()?)193	}194195	fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>196	where197		V: serde::de::Visitor<'de>,198	{199		visitor.visit_u32(self.parse_int()?)200	}201202	fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>203	where204		V: serde::de::Visitor<'de>,205	{206		visitor.visit_u64(self.parse_int()?)207	}208209	fn deserialize_f32<V>(self, _visitor: V) -> Result<V::Value, Self::Error>210	where211		V: serde::de::Visitor<'de>,212	{213		todo!()214	}215216	fn deserialize_f64<V>(self, _visitor: V) -> Result<V::Value, Self::Error>217	where218		V: serde::de::Visitor<'de>,219	{220		todo!()221	}222223	fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>224	where225		V: serde::de::Visitor<'de>,226	{227		visitor.visit_char(self.parse_char()?)228	}229230	fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>231	where232		V: serde::de::Visitor<'de>,233	{234		visitor.visit_str(self.parse_string()?)235	}236237	fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>238	where239		V: serde::de::Visitor<'de>,240	{241		visitor.visit_string(self.parse_string()?.to_owned())242	}243244	fn deserialize_bytes<V>(self, _visitor: V) -> Result<V::Value, Self::Error>245	where246		V: serde::de::Visitor<'de>,247	{248		todo!()249	}250251	fn deserialize_byte_buf<V>(self, _visitor: V) -> Result<V::Value, Self::Error>252	where253		V: serde::de::Visitor<'de>,254	{255		todo!()256	}257258	fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>259	where260		V: serde::de::Visitor<'de>,261	{262		match self {263			Value::Null => visitor.visit_none(),264			v => visitor.visit_some(v),265		}266	}267268	fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>269	where270		V: serde::de::Visitor<'de>,271	{272		self.parse_null()?;273		visitor.visit_unit()274	}275276	fn deserialize_unit_struct<V>(277		self,278		_name: &'static str,279		visitor: V,280	) -> Result<V::Value, Self::Error>281	where282		V: serde::de::Visitor<'de>,283	{284		self.deserialize_unit(visitor)285	}286287	fn deserialize_newtype_struct<V>(288		self,289		_name: &'static str,290		visitor: V,291	) -> Result<V::Value, Self::Error>292	where293		V: serde::de::Visitor<'de>,294	{295		visitor.visit_newtype_struct(self)296	}297298	fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>299	where300		V: serde::de::Visitor<'de>,301	{302		visitor.visit_seq(self.parse_array().map(ArrayAccess::new)?)303	}304305	fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>306	where307		V: serde::de::Visitor<'de>,308	{309		self.deserialize_seq(visitor)310	}311312	fn deserialize_tuple_struct<V>(313		self,314		_name: &'static str,315		_len: usize,316		visitor: V,317	) -> Result<V::Value, Self::Error>318	where319		V: serde::de::Visitor<'de>,320	{321		self.deserialize_seq(visitor)322	}323324	fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>325	where326		V: serde::de::Visitor<'de>,327	{328		visitor.visit_map(self.parse_object().map(ObjectAccess::new)?)329	}330331	fn deserialize_struct<V>(332		self,333		_name: &'static str,334		_fields: &'static [&'static str],335		visitor: V,336	) -> Result<V::Value, Self::Error>337	where338		V: serde::de::Visitor<'de>,339	{340		self.deserialize_map(visitor)341	}342343	fn deserialize_enum<V>(344		self,345		_name: &'static str,346		_variants: &'static [&'static str],347		_visitor: V,348	) -> Result<V::Value, Self::Error>349	where350		V: serde::de::Visitor<'de>,351	{352		todo!()353	}354355	fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>356	where357		V: serde::de::Visitor<'de>,358	{359		self.deserialize_str(visitor)360	}361362	fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>363	where364		V: serde::de::Visitor<'de>,365	{366		self.deserialize_any(visitor)367	}368}
after · crates/nixlike/src/de_impl.rs
1use std::convert::{TryFrom, TryInto};23use linked_hash_map::LinkedHashMap;4use serde::{5	de::{self, MapAccess, SeqAccess},6	Deserializer,7};89use crate::{Error, Value};1011struct ObjectAccess {12	iter: linked_hash_map::IntoIter<String, Value>,13	value: Option<Value>,14}15impl ObjectAccess {16	fn new(v: LinkedHashMap<String, Value>) -> Self {17		Self {18			iter: v.into_iter(),19			value: None,20		}21	}22}2324impl<'de> MapAccess<'de> for ObjectAccess {25	type Error = Error;2627	fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>28	where29		K: de::DeserializeSeed<'de>,30	{31		if let Some((k, v)) = self.iter.next() {32			let _ = self.value.insert(v);33			Ok(Some(seed.deserialize(Value::String(k))?))34		} else {35			Ok(None)36		}37	}3839	fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>40	where41		V: de::DeserializeSeed<'de>,42	{43		seed.deserialize(self.value.take().unwrap())44	}45}4647struct ArrayAccess {48	iter: std::vec::IntoIter<Value>,49}50impl ArrayAccess {51	fn new(v: Vec<Value>) -> Self {52		Self {53			iter: v.into_iter(),54		}55	}56}5758impl<'de> SeqAccess<'de> for ArrayAccess {59	type Error = Error;6061	fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>62	where63		T: de::DeserializeSeed<'de>,64	{65		if let Some(v) = self.iter.next() {66			Ok(Some(seed.deserialize(v)?))67		} else {68			Ok(None)69		}70	}71}7273impl Value {74	fn parse_int<T: TryFrom<i64>>(&self) -> Result<T, Error> {75		match self {76			Value::Number(n) => Ok((*n).try_into().map_err(|_| Error::BadNumber)?),77			_ => Err(Error::Expected("integer")),78		}79	}80	fn parse_boolean(self) -> Result<bool, Error> {81		match self {82			Value::Boolean(b) => Ok(b),83			_ => Err(Error::Expected("boolean")),84		}85	}86	pub fn parse_string(&self) -> Result<&str, Error> {87		match self {88			Value::String(s) => Ok(s),89			_ => Err(Error::Expected("string")),90		}91	}92	fn parse_char(self) -> Result<char, Error> {93		match self {94			Value::String(s) if s.chars().count() == 1 => Ok(s.chars().next().unwrap()),95			_ => Err(Error::Expected("char")),96		}97	}98	fn parse_array(self) -> Result<Vec<Value>, Error> {99		match self {100			Value::Array(s) => Ok(s),101			_ => Err(Error::Expected("array")),102		}103	}104	fn parse_object(self) -> Result<LinkedHashMap<String, Value>, Error> {105		match self {106			Value::Object(s) => Ok(s),107			_ => Err(Error::Expected("object")),108		}109	}110	fn parse_null(self) -> Result<(), Error> {111		match self {112			Value::Null => Ok(()),113			_ => Err(Error::Expected("null")),114		}115	}116}117118impl de::Error for Error {119	fn custom<T>(msg: T) -> Self120	where121		T: std::fmt::Display,122	{123		Self::Custom(format!("{}", msg))124	}125}126127impl<'de> Deserializer<'de> for Value {128	type Error = Error;129130	fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>131	where132		V: serde::de::Visitor<'de>,133	{134		match self {135			Value::Number(f) => visitor.visit_i64(f),136			Value::String(s) => visitor.visit_str(&s),137			Value::Boolean(b) => visitor.visit_bool(b),138			Value::Object(o) => visitor.visit_map(ObjectAccess::new(o)),139			Value::Array(a) => visitor.visit_seq(ArrayAccess::new(a)),140			Value::Null => visitor.visit_none(),141		}142	}143144	fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>145	where146		V: serde::de::Visitor<'de>,147	{148		visitor.visit_bool(self.parse_boolean()?)149	}150151	fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>152	where153		V: serde::de::Visitor<'de>,154	{155		visitor.visit_i8(self.parse_int()?)156	}157158	fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>159	where160		V: serde::de::Visitor<'de>,161	{162		visitor.visit_i16(self.parse_int()?)163	}164165	fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>166	where167		V: serde::de::Visitor<'de>,168	{169		visitor.visit_i32(self.parse_int()?)170	}171172	fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>173	where174		V: serde::de::Visitor<'de>,175	{176		visitor.visit_i64(self.parse_int()?)177	}178179	fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>180	where181		V: serde::de::Visitor<'de>,182	{183		visitor.visit_u8(self.parse_int()?)184	}185186	fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>187	where188		V: serde::de::Visitor<'de>,189	{190		visitor.visit_u16(self.parse_int()?)191	}192193	fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>194	where195		V: serde::de::Visitor<'de>,196	{197		visitor.visit_u32(self.parse_int()?)198	}199200	fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>201	where202		V: serde::de::Visitor<'de>,203	{204		visitor.visit_u64(self.parse_int()?)205	}206207	fn deserialize_f32<V>(self, _visitor: V) -> Result<V::Value, Self::Error>208	where209		V: serde::de::Visitor<'de>,210	{211		todo!()212	}213214	fn deserialize_f64<V>(self, _visitor: V) -> Result<V::Value, Self::Error>215	where216		V: serde::de::Visitor<'de>,217	{218		todo!()219	}220221	fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>222	where223		V: serde::de::Visitor<'de>,224	{225		visitor.visit_char(self.parse_char()?)226	}227228	fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>229	where230		V: serde::de::Visitor<'de>,231	{232		visitor.visit_str(self.parse_string()?)233	}234235	fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>236	where237		V: serde::de::Visitor<'de>,238	{239		visitor.visit_string(self.parse_string()?.to_owned())240	}241242	fn deserialize_bytes<V>(self, _visitor: V) -> Result<V::Value, Self::Error>243	where244		V: serde::de::Visitor<'de>,245	{246		todo!()247	}248249	fn deserialize_byte_buf<V>(self, _visitor: V) -> Result<V::Value, Self::Error>250	where251		V: serde::de::Visitor<'de>,252	{253		todo!()254	}255256	fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>257	where258		V: serde::de::Visitor<'de>,259	{260		match self {261			Value::Null => visitor.visit_none(),262			v => visitor.visit_some(v),263		}264	}265266	fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>267	where268		V: serde::de::Visitor<'de>,269	{270		self.parse_null()?;271		visitor.visit_unit()272	}273274	fn deserialize_unit_struct<V>(275		self,276		_name: &'static str,277		visitor: V,278	) -> Result<V::Value, Self::Error>279	where280		V: serde::de::Visitor<'de>,281	{282		self.deserialize_unit(visitor)283	}284285	fn deserialize_newtype_struct<V>(286		self,287		_name: &'static str,288		visitor: V,289	) -> Result<V::Value, Self::Error>290	where291		V: serde::de::Visitor<'de>,292	{293		visitor.visit_newtype_struct(self)294	}295296	fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>297	where298		V: serde::de::Visitor<'de>,299	{300		visitor.visit_seq(self.parse_array().map(ArrayAccess::new)?)301	}302303	fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>304	where305		V: serde::de::Visitor<'de>,306	{307		self.deserialize_seq(visitor)308	}309310	fn deserialize_tuple_struct<V>(311		self,312		_name: &'static str,313		_len: usize,314		visitor: V,315	) -> Result<V::Value, Self::Error>316	where317		V: serde::de::Visitor<'de>,318	{319		self.deserialize_seq(visitor)320	}321322	fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>323	where324		V: serde::de::Visitor<'de>,325	{326		visitor.visit_map(self.parse_object().map(ObjectAccess::new)?)327	}328329	fn deserialize_struct<V>(330		self,331		_name: &'static str,332		_fields: &'static [&'static str],333		visitor: V,334	) -> Result<V::Value, Self::Error>335	where336		V: serde::de::Visitor<'de>,337	{338		self.deserialize_map(visitor)339	}340341	fn deserialize_enum<V>(342		self,343		_name: &'static str,344		_variants: &'static [&'static str],345		_visitor: V,346	) -> Result<V::Value, Self::Error>347	where348		V: serde::de::Visitor<'de>,349	{350		todo!()351	}352353	fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>354	where355		V: serde::de::Visitor<'de>,356	{357		self.deserialize_str(visitor)358	}359360	fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>361	where362		V: serde::de::Visitor<'de>,363	{364		self.deserialize_any(visitor)365	}366}
modifiedcrates/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) {
modifiedcrates/nixlike/src/se_impl.rsdiffbeforeafterboth
--- 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<String, Value>, Option<String>);
+pub struct MySerializeMap(LinkedHashMap<String, Value>, Option<String>);
 
 impl SerializeMap for MySerializeMap {
 	type Ok = Value;
@@ -127,7 +128,7 @@
 	}
 }
 
-pub struct MySerializeStruct(BTreeMap<String, Value>);
+pub struct MySerializeStruct(LinkedHashMap<String, Value>);
 
 impl SerializeStruct for MySerializeStruct {
 	type Ok = Value;
@@ -147,7 +148,7 @@
 	}
 }
 
-pub struct MySerializeStructVariant(String, BTreeMap<String, Value>);
+pub struct MySerializeStructVariant(String, LinkedHashMap<String, Value>);
 
 impl SerializeStructVariant for MySerializeStructVariant {
 	type Ok = Value;
@@ -336,7 +337,7 @@
 	}
 
 	fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
-		Ok(MySerializeMap(BTreeMap::new(), None))
+		Ok(MySerializeMap(LinkedHashMap::new(), None))
 	}
 
 	fn serialize_struct(
@@ -344,7 +345,7 @@
 		_name: &'static str,
 		_len: usize,
 	) -> Result<Self::SerializeStruct, Self::Error> {
-		Ok(MySerializeStruct(BTreeMap::new()))
+		Ok(MySerializeStruct(LinkedHashMap::new()))
 	}
 
 	fn serialize_struct_variant(
@@ -356,7 +357,7 @@
 	) -> Result<Self::SerializeStructVariant, Self::Error> {
 		Ok(MySerializeStructVariant(
 			variant.to_owned(),
-			BTreeMap::new(),
+			LinkedHashMap::new(),
 		))
 	}
 }
modifiedcrates/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(),
 					));