From 4754a13fb3fa33d074259db2e04841905c2997b3 Mon Sep 17 00:00:00 2001 From: Graham Esau Date: Mon, 15 Aug 2022 10:51:25 +0100 Subject: [PATCH] Ignore `bound` set in serde attrs --- schemars_derive/src/attr/schemars_to_serde.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/schemars_derive/src/attr/schemars_to_serde.rs b/schemars_derive/src/attr/schemars_to_serde.rs index dd871b0..aef2ebf 100644 --- a/schemars_derive/src/attr/schemars_to_serde.rs +++ b/schemars_derive/src/attr/schemars_to_serde.rs @@ -20,6 +20,7 @@ pub(crate) static SERDE_KEYWORDS: &[&str] = &[ "flatten", "remote", "transparent", + // Special case - `bound` is removed from serde attrs, so is only respected when present in schemars attr. "bound", // Special cases - `with`/`serialize_with` are passed to serde but not copied from schemars attrs to serde attrs. // This is because we want to preserve any serde attribute's `serialize_with` value to determine whether the field's @@ -57,7 +58,7 @@ fn process_serde_field_attrs<'a>(ctxt: &Ctxt, fields: impl Iterator) { - // Remove #[serde(...)] attributes (some may be re-added later) + // Remove #[serde(...)] attributes (some may be re-added later) let (serde_attrs, other_attrs): (Vec<_>, Vec<_>) = attrs.drain(..).partition(|at| at.path.is_ident("serde")); *attrs = other_attrs; @@ -94,7 +95,10 @@ fn process_attrs(ctxt: &Ctxt, attrs: &mut Vec) { .flatten() { if let Ok(i) = get_meta_ident(&ctxt, &meta) { - if !schemars_meta_names.contains(&i) && SERDE_KEYWORDS.contains(&i.as_ref()) { + if !schemars_meta_names.contains(&i) + && SERDE_KEYWORDS.contains(&i.as_ref()) + && i != "bound" + { serde_meta.push(meta); } } @@ -166,10 +170,10 @@ mod tests { #[misc] struct MyStruct { /// blah blah blah - #[serde(skip_serializing_if = "some_fn")] + #[serde(skip_serializing_if = "some_fn", bound = "removed")] field1: i32, #[serde(serialize_with = "se", deserialize_with = "de")] - #[schemars(with = "with")] + #[schemars(with = "with", bound = "bound")] field2: i32, #[schemars(skip)] #[serde(skip_serializing)] @@ -184,7 +188,7 @@ mod tests { #[doc = r" blah blah blah"] #[serde(skip_serializing_if = "some_fn")] field1: i32, - #[schemars(with = "with")] + #[schemars(with = "with", bound = "bound")] #[serde(serialize_with = "se")] field2: i32, #[schemars(skip)]