Fixed serializiation determinacy problems.

This commit is contained in:
Dave Hrycyszyn
2024-06-18 11:19:36 +01:00
parent 416d1ad88b
commit a4441af53a
9 changed files with 44 additions and 21 deletions

View File

@@ -17,15 +17,16 @@ bft = []
bft-crdt-derive = { path = "bft-crdt-derive" }
colored = "2.0.0"
fastcrypto = "0.1.8"
indexmap = { version = "2.2.6", features = ["serde"] }
itertools = "0.10.5"
rand = "0.8.5"
random_color = "0.6.1"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.85"
serde_json = { version = "1.0.85", features = ["preserve_order"] }
serde_with = "3.8.1"
sha2 = "0.10.6"
[dev-dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.85"
time = "0.1"
serde = { version = "1.0", features = ["derive"] }
serde_json = { version = "1.0.85", features = ["preserve_order"] }

View File

@@ -8,6 +8,7 @@ publish = false
proc-macro = true
[dependencies]
indexmap = { version = "2.2.6", features = ["serde"] }
proc-macro2 = "1.0.47"
proc-macro-crate = "1.2.1"
quote = "1.0.21"

View File

@@ -6,13 +6,12 @@ use syn::{
parse::{self, Parser},
parse_macro_input,
spanned::Spanned,
Data, DeriveInput, Field, Fields, ItemStruct, LitStr, Type
Data, DeriveInput, Field, Fields, ItemStruct, LitStr, Type,
};
/// Helper to get tokenstream representing the parent crate
fn get_crate_name() -> TokenStream {
let cr8 = crate_name("bft-json-crdt")
.unwrap_or(FoundCrate::Itself);
let cr8 = crate_name("bft-json-crdt").unwrap_or(FoundCrate::Itself);
match cr8 {
FoundCrate::Itself => quote! { ::bft_json_crdt },
FoundCrate::Name(name) => {
@@ -106,7 +105,7 @@ pub fn derive_json_crdt(input: OgTokenStream) -> OgTokenStream {
})
} else {
Err(format!("failed to convert {:?} -> {}<T>", value, #ident_str.to_string()))
}
}
}
}
@@ -116,7 +115,7 @@ pub fn derive_json_crdt(input: OgTokenStream) -> OgTokenStream {
#(fields.push(format!("{}", #ident_strings.to_string()));)*
write!(f, "{{ {:?} }}", fields.join(", "))
}
}
}
impl #impl_generics #crate_name::json_crdt::CrdtNode for #ident #ty_generics #where_clause {
fn apply(&mut self, op: #crate_name::op::Op<#crate_name::json_crdt::JsonValue>) -> #crate_name::json_crdt::OpState {
@@ -128,7 +127,7 @@ pub fn derive_json_crdt(input: OgTokenStream) -> OgTokenStream {
}
if self.path.len() == op.path.len() {
return #crate_name::json_crdt::OpState::ErrApplyOnStruct;
return #crate_name::json_crdt::OpState::ErrApplyOnStruct;
} else {
let idx = self.path.len();
if let #crate_name::op::PathSegment::Field(path_seg) = &op.path[idx] {
@@ -139,12 +138,12 @@ pub fn derive_json_crdt(input: OgTokenStream) -> OgTokenStream {
_ => {},
};
};
return #crate_name::json_crdt::OpState::ErrPathMismatch
return #crate_name::json_crdt::OpState::ErrPathMismatch
}
}
fn view(&self) -> #crate_name::json_crdt::JsonValue {
let mut view_map = std::collections::HashMap::new();
let mut view_map = indexmap::IndexMap::new();
#(view_map.insert(#ident_strings.to_string(), self.#ident_literals.view().into());)*
#crate_name::json_crdt::JsonValue::Object(view_map)
}
@@ -173,7 +172,7 @@ pub fn derive_json_crdt(input: OgTokenStream) -> OgTokenStream {
fn debug_view(&self, _indent: usize) -> String {
"".to_string()
}
}
}
};
// Hand the output tokens back to the compiler

View File

@@ -17,6 +17,7 @@ use fastcrypto::{
traits::{KeyPair, ToFromBytes},
// Verifier,
};
use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
use serde_with::{serde_as, Bytes};
@@ -256,7 +257,7 @@ pub enum JsonValue {
Number(f64),
String(String),
Array(Vec<JsonValue>),
Object(HashMap<String, JsonValue>),
Object(IndexMap<String, JsonValue>),
}
impl Display for JsonValue {