diff --git a/Cargo.lock b/Cargo.lock index ae0316622..155430a4a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -157,7 +157,7 @@ dependencies = [ "proc-macro-hack", "proc-macro2", "quote", - "syn", + "syn 1.0.72", ] [[package]] @@ -217,7 +217,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.72", "version_check", ] @@ -240,18 +240,18 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -339,9 +339,9 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "serde" -version = "1.0.126" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] @@ -401,13 +401,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.28", ] [[package]] @@ -466,7 +466,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.72", ] [[package]] @@ -480,6 +480,17 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "syn" +version = "2.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "tempfile" version = "3.2.0" @@ -530,9 +541,15 @@ checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.72", ] +[[package]] +name = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" + [[package]] name = "unicode-segmentation" version = "1.7.1" diff --git a/serde-generate/Cargo.toml b/serde-generate/Cargo.toml index 668a4620d..734218970 100644 --- a/serde-generate/Cargo.toml +++ b/serde-generate/Cargo.toml @@ -19,7 +19,7 @@ exclude = [ heck = "0.3.2" include_dir = "0.6.0" maplit = "1.0.2" -serde = { version = "1.0.126", features = ["derive"] } +serde = { version = "1.0.193", features = ["derive"] } serde_bytes = "0.11.5" serde_yaml = "0.8.17" structopt = "0.3.21" diff --git a/serde-generate/src/golang.rs b/serde-generate/src/golang.rs index 0bc10d6e1..042100113 100644 --- a/serde-generate/src/golang.rs +++ b/serde-generate/src/golang.rs @@ -60,8 +60,7 @@ impl<'a> CodeGenerator<'a> { Self { config, serde_module_path: - "github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang" - .to_string(), + "github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang".to_string(), external_qualified_names, } } diff --git a/serde-generate/src/rust.rs b/serde-generate/src/rust.rs index c2a96aa0b..4918c4f9a 100644 --- a/serde-generate/src/rust.rs +++ b/serde-generate/src/rust.rs @@ -243,7 +243,7 @@ where Option(format) => format!("Option<{}>", Self::quote_type(format, known_sizes)), Seq(format) => format!("Vec<{}>", Self::quote_type(format, None)), Map { key, value } => format!( - "Map<{}, {}>", + "std::collections::BTreeMap<{}, {}>", Self::quote_type(key, None), Self::quote_type(value, None) ), diff --git a/serde-reflection/Cargo.toml b/serde-reflection/Cargo.toml index fcc173671..1f9a0e41d 100644 --- a/serde-reflection/Cargo.toml +++ b/serde-reflection/Cargo.toml @@ -17,7 +17,7 @@ exclude = [ [dependencies] thiserror = "1.0.25" -serde = { version = "1.0.126", features = ["derive"] } +serde = { version = "1.0.193", features = ["derive"] } once_cell = "1.7.2" [dev-dependencies] diff --git a/serde-reflection/src/trace.rs b/serde-reflection/src/trace.rs index 8a82d023d..de8c4214f 100644 --- a/serde-reflection/src/trace.rs +++ b/serde-reflection/src/trace.rs @@ -10,7 +10,10 @@ use crate::{ }; use once_cell::sync::Lazy; use serde::{de::DeserializeSeed, Deserialize, Serialize}; -use std::collections::{BTreeMap, BTreeSet}; +use std::{ + collections::{BTreeMap, BTreeSet}, + ops::Deref, +}; /// A map of container formats. pub type Registry = BTreeMap; @@ -285,6 +288,60 @@ impl Tracer { self.record_container(samples, name, format, value, false) } + /// Removes aliases for a field in a container from the registry. + /// + /// The serde doesn't differentiate between alias names from field names so + /// this is a way to inform the registry of aliases of a particular field in a + /// container. + pub fn ignore_aliases( + &mut self, + container_name: &'static str, + aliases: &[&'static str], + ) -> Result<()> { + let container_format = match self.registry.get_mut(container_name) { + None => { + return Err(Error::Custom(format!( + "cannot alias. container not found: {}", + container_name + ))) + } + Some(container_format) => container_format, + }; + match container_format { + ContainerFormat::Struct(named_formats) => { + let (non_alias_formats, alias_formats): (Vec<_>, Vec<_>) = named_formats + .iter() + .cloned() + .partition(|format| !aliases.contains(&format.name.deref())); + + if alias_formats.len() != aliases.len() { + return Err(Error::Custom(format!( + "cannot ignore alias. not all aliases are found in container: {:?}", + aliases + ))); + } + + for alias_format in alias_formats { + if !alias_format.value.is_unknown() { + return Err(Error::Custom(format!( + "cannot ignore alias. tracer registered value: {}", + alias_format.name + ))); + } + } + + *named_formats = non_alias_formats; + } + _ => { + return Err(Error::Custom(format!( + "cannot record alias for non-struct container: {}", + container_name + ))) + } + } + Ok(()) + } + pub(crate) fn get_sample<'de, 'a>( &'a self, samples: &'de Samples, diff --git a/serde-reflection/tests/serde.rs b/serde-reflection/tests/serde.rs index 811d5f69f..f2e3c9ff1 100644 --- a/serde-reflection/tests/serde.rs +++ b/serde-reflection/tests/serde.rs @@ -457,3 +457,35 @@ fn test_repeated_tracing() { )))))) ); } + +#[test] +fn test_trace_deserialization_with_alias_types() { + #[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone)] + struct Foo { + #[serde(rename = "b", alias = "c")] + pub a: Vec, + } + + let samples = Samples::new(); + let mut tracer = Tracer::new(TracerConfig::default()); + + tracer.trace_type::(&samples).unwrap(); + assert_eq!( + tracer.registry().unwrap_err(), + Error::UnknownFormatInContainer("Foo".into()), + ); + + let mut tracer = Tracer::new(TracerConfig::default()); + + tracer.trace_type::(&samples).unwrap(); + tracer.ignore_aliases("Foo", &["c"]).unwrap(); + + let registry = tracer.registry().unwrap(); + assert_eq!( + *registry.get("Foo").unwrap(), + ContainerFormat::Struct(vec![Named { + name: "b".into(), + value: Format::Seq(Box::new(Format::U8)) + }]) + ); +}