Support inline regex

This commit is contained in:
Graham Esau 2021-04-16 22:31:03 +01:00
parent 5f841f2e5c
commit c013052f59
3 changed files with 23 additions and 4 deletions

View file

@ -13,6 +13,7 @@
"pair", "pair",
"regex_str1", "regex_str1",
"regex_str2", "regex_str2",
"regex_str3",
"required_option", "required_option",
"tel", "tel",
"x" "x"
@ -32,6 +33,10 @@
"type": "string", "type": "string",
"pattern": "^[Hh]ello\\b" "pattern": "^[Hh]ello\\b"
}, },
"regex_str3": {
"type": "string",
"pattern": "^\\d+$"
},
"contains_str1": { "contains_str1": {
"type": "string", "type": "string",
"pattern": "substring\\.\\.\\." "pattern": "substring\\.\\.\\."

View file

@ -14,6 +14,8 @@ pub struct Struct {
regex_str1: String, regex_str1: String,
#[validate(regex(path = "STARTS_WITH_HELLO", code = "foo"))] #[validate(regex(path = "STARTS_WITH_HELLO", code = "foo"))]
regex_str2: String, regex_str2: String,
#[validate(regex(pattern = r"^\d+$"))]
regex_str3: String,
#[validate(contains = "substring...")] #[validate(contains = "substring...")]
contains_str1: String, contains_str1: String,
#[validate(contains(pattern = "substring...", message = "bar"))] #[validate(contains(pattern = "substring...", message = "bar"))]

View file

@ -2,7 +2,7 @@ use super::parse_lit_str;
use proc_macro2::TokenStream; use proc_macro2::TokenStream;
use syn::ExprLit; use syn::ExprLit;
use syn::NestedMeta; use syn::NestedMeta;
use syn::{Expr, Lit, Meta, MetaNameValue, Path}; use syn::{Expr, Lit, Meta, MetaNameValue};
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct ValidationAttrs { pub struct ValidationAttrs {
@ -11,7 +11,7 @@ pub struct ValidationAttrs {
pub length_equal: Option<Expr>, pub length_equal: Option<Expr>,
pub range_min: Option<Expr>, pub range_min: Option<Expr>,
pub range_max: Option<Expr>, pub range_max: Option<Expr>,
pub regex: Option<Path>, pub regex: Option<Expr>,
pub contains: Option<String>, pub contains: Option<String>,
pub required: bool, pub required: bool,
pub format: Option<&'static str>, pub format: Option<&'static str>,
@ -84,7 +84,9 @@ impl ValidationAttrs {
path, path,
lit: Lit::Str(regex), lit: Lit::Str(regex),
.. ..
})) if path.is_ident("regex") => self.regex = parse_lit_str(regex).ok(), })) if path.is_ident("regex") => {
self.regex = parse_lit_str::<syn::ExprPath>(regex).ok().map(Expr::Path)
}
NestedMeta::Meta(Meta::List(meta_list)) if meta_list.path.is_ident("regex") => { NestedMeta::Meta(Meta::List(meta_list)) if meta_list.path.is_ident("regex") => {
self.regex = meta_list.nested.iter().find_map(|x| match x { self.regex = meta_list.nested.iter().find_map(|x| match x {
@ -92,7 +94,17 @@ impl ValidationAttrs {
path, path,
lit: Lit::Str(regex), lit: Lit::Str(regex),
.. ..
})) if path.is_ident("path") => parse_lit_str(regex).ok(), })) if path.is_ident("path") => {
parse_lit_str::<syn::ExprPath>(regex).ok().map(Expr::Path)
}
NestedMeta::Meta(Meta::NameValue(MetaNameValue {
path,
lit: Lit::Str(regex),
..
})) if path.is_ident("pattern") => Some(Expr::Lit(syn::ExprLit {
attrs: Vec::new(),
lit: Lit::Str(regex.clone()),
})),
_ => None, _ => None,
}); });
} }