(field: &syn::Field)
| 86 | } |
| 87 | |
| 88 | pub fn collect_validations(field: &syn::Field) -> Vec<Validator> { |
| 89 | let mut validators = vec![]; |
| 90 | |
| 91 | for attr in field.attrs.iter() { |
| 92 | if !attr.path().is_ident(VALIDATE) && !attr.path().is_ident(VALIDIFY) { |
| 93 | continue; |
| 94 | } |
| 95 | |
| 96 | let syn::Meta::List(ref list) = attr.meta else { |
| 97 | let syn::Meta::Path(_) = attr.meta else { |
| 98 | abort!( |
| 99 | attr.meta.span(), |
| 100 | "Validate must be applied as a list, i.e. `validate(/*...*/)` or as a path `validate` for nested validation" |
| 101 | ) |
| 102 | }; |
| 103 | validators.push(Validator::Nested); |
| 104 | continue; |
| 105 | }; |
| 106 | |
| 107 | list.parse_nested_meta(|meta| { |
| 108 | if meta.path.is_ident(ITER) { |
| 109 | let mut validators_iter = vec![]; |
| 110 | meta.parse_nested_meta(|meta| { |
| 111 | parse_single_validation(meta, &mut validators_iter)?; |
| 112 | Ok(()) |
| 113 | })?; |
| 114 | validators.push(Validator::Iter(validators_iter)); |
| 115 | } else { |
| 116 | parse_single_validation(meta, &mut validators)?; |
| 117 | } |
| 118 | Ok(()) |
| 119 | }) |
| 120 | .unwrap_or_else(|e| abort!(e.span(), e)); |
| 121 | } |
| 122 | |
| 123 | validators |
| 124 | } |
| 125 | |
| 126 | fn parse_single_validation( |
| 127 | meta: ParseNestedMeta<'_>, |
no test coverage detected