Allow setting validation attributes via #[schemars(...)]

This commit is contained in:
Graham Esau 2021-04-18 22:17:53 +01:00
parent c013052f59
commit 7914593d89
17 changed files with 607 additions and 99 deletions

View file

@ -165,10 +165,7 @@ impl Attrs {
_ if ignore_errors => {}
Meta(meta_item) => {
let is_known_serde_keyword = schemars_to_serde::SERDE_KEYWORDS
.iter()
.any(|k| meta_item.path().is_ident(k));
if !is_known_serde_keyword {
if !is_known_serde_or_validation_keyword(meta_item) {
let path = meta_item
.path()
.into_token_stream()
@ -176,16 +173,13 @@ impl Attrs {
.replace(' ', "");
errors.error_spanned_by(
meta_item.path(),
format!("unknown schemars container attribute `{}`", path),
format!("unknown schemars attribute `{}`", path),
);
}
}
Lit(lit) => {
errors.error_spanned_by(
lit,
"unexpected literal in schemars container attribute",
);
errors.error_spanned_by(lit, "unexpected literal in schemars attribute");
}
}
}
@ -193,6 +187,16 @@ impl Attrs {
}
}
fn is_known_serde_or_validation_keyword(meta: &syn::Meta) -> bool {
let mut known_keywords = schemars_to_serde::SERDE_KEYWORDS
.iter()
.chain(validation::VALIDATION_KEYWORDS);
meta.path()
.get_ident()
.map(|i| known_keywords.any(|k| i == k))
.unwrap_or(false)
}
fn get_meta_items(
attr: &syn::Attribute,
attr_type: &'static str,