diff --git a/Cargo.toml b/Cargo.toml index a0660c3..2a2db66 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,7 @@ chksum-md5 = { version = "0.1.0", optional = true } colored = "3.0.0" derive_more = { version = "2.0.1", default-features = false, features = ["deref", "deref_mut", "from"] } enum-as-inner = "0.6.0" +flexbuffers = "25.2.10" getset = "0.1.2" itertools = "0.14.0" mlua = { version = "0.10.2", features = ["lua54", "vendored"], optional = true } diff --git a/src/serde.rs b/src/serde.rs index badfcd4..9130cc0 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -1,7 +1,7 @@ //! Utilities for (de-)serializing use std::{ - collections::HashMap, + collections::BTreeMap, marker::PhantomData, sync::{Arc, LazyLock, Mutex, RwLock}, }; @@ -36,13 +36,18 @@ where { *DEDUPLICATE_SOURCE_FILES.write().unwrap() = true; SERIALIZE_DATA.lock().unwrap().clear(); - let mut s = serializer.serialize_struct("SourceFileWrapper", 2)?; - s.serialize_field("data", &self.0)?; - *DEDUPLICATE_SOURCE_FILES.write().unwrap() = false; + let mut serialized_data = flexbuffers::FlexbufferSerializer::new(); + self.0 + .serialize(&mut serialized_data) + .map_err(|_| serde::ser::Error::custom("could not buffer serialization"))?; + drop(serialized_data); + let mut s = serializer.serialize_struct("SerdeWrapper", 3)?; s.serialize_field( "source_files", &SERIALIZE_DATA.lock().unwrap().id_to_source_file, )?; + s.serialize_field("data", &self.0)?; + *DEDUPLICATE_SOURCE_FILES.write().unwrap() = false; s.end() } } @@ -78,7 +83,7 @@ where where V: de::SeqAccess<'de>, { - let source_files: HashMap = seq + let source_files: BTreeMap = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(0, &self))?; *DESERIALIZE_DATA.write().unwrap() = Some(DeserializeData { @@ -98,7 +103,7 @@ where where V: de::MapAccess<'de>, { - let mut source_files: Option> = None; + let mut source_files: Option> = None; let mut data = None; while let Some(key) = map.next_key()? { @@ -147,8 +152,8 @@ where #[derive(Debug, Default)] struct SerializeData { id_counter: usize, - ptr_to_id: HashMap, - id_to_source_file: HashMap, + ptr_to_id: BTreeMap, + id_to_source_file: BTreeMap, } impl SerializeData { @@ -198,7 +203,7 @@ impl Serialize for Span { #[derive(Debug, Default)] struct DeserializeData { - id_to_source_file: HashMap>, + id_to_source_file: BTreeMap>, } impl<'de> Deserialize<'de> for Span {