aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBastien Orivel2018-06-20 08:20:42 +0200
committerBastien Orivel2018-06-20 08:20:42 +0200
commite5ec5504890b47a7df3b032361ff37f9ca369e22 (patch)
tree72d23adfa7d895da64928c210a95bea3b1b4e4de
parentb6a23b500cf69f312dcd031900fb369176a49429 (diff)
downloadvalidator-e5ec5504890b47a7df3b032361ff37f9ca369e22.tar.bz2
Update syn, quote and bump version
-rw-r--r--validator_derive/Cargo.toml7
-rw-r--r--validator_derive/src/lib.rs17
-rw-r--r--validator_derive/src/lit.rs4
-rw-r--r--validator_derive/src/quoting.rs38
-rw-r--r--validator_derive/src/validation.rs10
5 files changed, 39 insertions, 37 deletions
diff --git a/validator_derive/Cargo.toml b/validator_derive/Cargo.toml
index 717a838..3e80bbc 100644
--- a/validator_derive/Cargo.toml
+++ b/validator_derive/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "validator_derive"
-version = "0.7.0"
+version = "0.7.1"
authors = ["Vincent Prouillet <vincent@wearewizards.io>"]
license = "MIT"
description = "Macros 1.1 implementation of #[derive(Validate)]"
@@ -16,8 +16,9 @@ phone = ["validator/phone"]
card = ["validator/card"]
[dependencies]
-syn = { version = "0.13", features = ["extra-traits"] }
-quote = "0.5"
+syn = { version = "0.14", features = ["extra-traits"] }
+quote = "0.6"
+proc-macro2 = "0.4"
if_chain = "0"
validator = { version = "0.7", path = "../validator"}
diff --git a/validator_derive/src/lib.rs b/validator_derive/src/lib.rs
index d05e5f5..b148ca1 100644
--- a/validator_derive/src/lib.rs
+++ b/validator_derive/src/lib.rs
@@ -3,6 +3,7 @@
#[macro_use]
extern crate quote;
extern crate proc_macro;
+extern crate proc_macro2;
#[macro_use]
extern crate syn;
#[macro_use]
@@ -37,7 +38,7 @@ pub fn derive_validation(input: TokenStream) -> TokenStream {
}
-fn impl_validate(ast: &syn::DeriveInput) -> quote::Tokens {
+fn impl_validate(ast: &syn::DeriveInput) -> proc_macro2::TokenStream {
// Ensure the macro is on a struct with named fields
let fields = match ast.data {
syn::Data::Struct(syn::DataStruct { ref fields, .. }) => {
@@ -110,7 +111,7 @@ fn find_struct_validation(struct_attrs: &Vec<syn::Attribute>) -> Option<SchemaVa
if let &syn::Meta::List(syn::MetaList { ref ident, ref nested, .. }) = item;
then {
- if ident.as_ref() != "schema" {
+ if ident != "schema" {
error("Only `schema` is allowed as validator on a struct")
}
@@ -125,7 +126,7 @@ fn find_struct_validation(struct_attrs: &Vec<syn::Attribute>) -> Option<SchemaVa
if let syn::Meta::NameValue(syn::MetaNameValue { ref ident, ref lit, .. }) = *item;
then {
- match ident.as_ref() {
+ match ident.to_string().as_ref() {
"function" => {
function = match lit_to_string(lit) {
Some(s) => s,
@@ -193,13 +194,13 @@ fn find_fields_type(fields: &Vec<syn::Field>) -> HashMap<String, String> {
let field_ident = field.ident.clone().unwrap().to_string();
let field_type = match field.ty {
syn::Type::Path(syn::TypePath { ref path, .. }) => {
- let mut tokens = quote::Tokens::new();
+ let mut tokens = proc_macro2::TokenStream::empty();
path.to_tokens(&mut tokens);
tokens.to_string().replace(' ', "")
},
syn::Type::Reference(syn::TypeReference { ref lifetime, ref elem, .. }) => {
- let mut tokens = quote::Tokens::new();
+ let mut tokens = proc_macro2::TokenStream::empty();
elem.to_tokens(&mut tokens);
let mut name = tokens.to_string().replace(' ', "");
if lifetime.is_some() {
@@ -280,7 +281,7 @@ fn find_validators_for_field(field: &syn::Field, field_types: &HashMap<String, S
},
// custom, contains, must_match, regex
syn::Meta::NameValue(syn::MetaNameValue { ref ident, ref lit, .. }) => {
- match ident.as_ref() {
+ match ident.to_string().as_ref() {
"custom" => {
match lit_to_string(lit) {
Some(s) => validators.push(FieldValidation::new(Validator::Custom(s))),
@@ -314,7 +315,7 @@ fn find_validators_for_field(field: &syn::Field, field_types: &HashMap<String, S
// Validators with several args
syn::Meta::List(syn::MetaList { ref ident, ref nested, .. }) => {
let meta_items = nested.iter().cloned().collect();
- match ident.as_ref() {
+ match ident.to_string().as_ref() {
"length" => {
assert_has_len(rust_ident.clone(), field_type);
validators.push(extract_length_validation(rust_ident.clone(), &meta_items));
@@ -374,7 +375,7 @@ fn find_original_field_name(meta_items: &Vec<&syn::NestedMeta>) -> Option<String
&syn::NestedMeta::Meta(ref item) => match *item {
syn::Meta::Word(_) => continue,
syn::Meta::NameValue(syn::MetaNameValue { ref ident, ref lit, .. }) => {
- if ident.as_ref() == "rename" {
+ if ident == "rename" {
original_name = Some(lit_to_string(lit).unwrap());
}
},
diff --git a/validator_derive/src/lit.rs b/validator_derive/src/lit.rs
index 839b62d..1864d8f 100644
--- a/validator_derive/src/lit.rs
+++ b/validator_derive/src/lit.rs
@@ -1,5 +1,5 @@
-use quote;
use syn;
+use proc_macro2;
pub fn lit_to_string(lit: &syn::Lit) -> Option<String> {
@@ -37,7 +37,7 @@ pub fn lit_to_bool(lit: &syn::Lit) -> Option<bool> {
}
}
-pub fn option_u64_to_tokens(opt: Option<u64>) -> quote::Tokens {
+pub fn option_u64_to_tokens(opt: Option<u64>) -> proc_macro2::TokenStream {
match opt {
Some(ref t) => quote!(::std::option::Option::Some(#t)),
None => quote!(::std::option::Option::None)
diff --git a/validator_derive/src/quoting.rs b/validator_derive/src/quoting.rs
index c78fd14..272226e 100644
--- a/validator_derive/src/quoting.rs
+++ b/validator_derive/src/quoting.rs
@@ -1,6 +1,6 @@
-use quote;
use validator::Validator;
use syn;
+use proc_macro2::{self, Span};
use lit::option_u64_to_tokens;
use validation::{FieldValidation, SchemaValidation};
@@ -26,7 +26,7 @@ impl FieldQuoter {
/// a reference to the validator
/// Also just use the ident without if it's optional and will go through
/// a if let first
- pub fn quote_validator_param(&self) -> quote::Tokens {
+ pub fn quote_validator_param(&self) -> proc_macro2::TokenStream {
let ident = &self.ident;
if self._type.starts_with("Option<") {
@@ -38,7 +38,7 @@ impl FieldQuoter {
}
}
- pub fn get_optional_validator_param(&self) -> quote::Tokens {
+ pub fn get_optional_validator_param(&self) -> proc_macro2::TokenStream {
let ident = &self.ident;
if self._type.starts_with("Option<&") || self._type.starts_with("Option<Option<&")
|| NUMBER_TYPES.contains(&self._type.as_ref()) {
@@ -50,7 +50,7 @@ impl FieldQuoter {
/// Wrap the quoted output of a validation with a if let Some if
/// the field type is an option
- pub fn wrap_if_option(&self, tokens: quote::Tokens) -> quote::Tokens {
+ pub fn wrap_if_option(&self, tokens: proc_macro2::TokenStream) -> proc_macro2::TokenStream {
let field_ident = &self.ident;
let optional_pattern_matched = self.get_optional_validator_param();
if self._type.starts_with("Option<Option<") {
@@ -72,7 +72,7 @@ impl FieldQuoter {
}
/// Quote an actual end-user error creation automatically
-fn quote_error(validation: &FieldValidation) -> quote::Tokens {
+fn quote_error(validation: &FieldValidation) -> proc_macro2::TokenStream {
let code = &validation.code;
let add_message_quoted = if let Some(ref m) = validation.message {
quote!(err.message = Some(::std::borrow::Cow::from(#m));)
@@ -87,7 +87,7 @@ fn quote_error(validation: &FieldValidation) -> quote::Tokens {
}
-pub fn quote_length_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> quote::Tokens {
+pub fn quote_length_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream {
let field_name = &field_quoter.name;
let validator_param = field_quoter.quote_validator_param();
@@ -138,7 +138,7 @@ pub fn quote_length_validation(field_quoter: &FieldQuoter, validation: &FieldVal
unreachable!()
}
-pub fn quote_range_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> quote::Tokens {
+pub fn quote_range_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream {
let field_name = &field_quoter.name;
let quoted_ident = field_quoter.quote_validator_param();
@@ -166,7 +166,7 @@ pub fn quote_range_validation(field_quoter: &FieldQuoter, validation: &FieldVali
}
#[cfg(feature = "card")]
-pub fn quote_credit_card_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> quote::Tokens {
+pub fn quote_credit_card_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream {
let field_name = &field_quoter.name;
let validator_param = field_quoter.quote_validator_param();
@@ -183,7 +183,7 @@ pub fn quote_credit_card_validation(field_quoter: &FieldQuoter, validation: &Fie
}
#[cfg(feature = "phone")]
-pub fn quote_phone_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> quote::Tokens {
+pub fn quote_phone_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream {
let field_name = &field_quoter.name;
let validator_param = field_quoter.quote_validator_param();
@@ -199,7 +199,7 @@ pub fn quote_phone_validation(field_quoter: &FieldQuoter, validation: &FieldVali
field_quoter.wrap_if_option(quoted)
}
-pub fn quote_url_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> quote::Tokens {
+pub fn quote_url_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream {
let field_name = &field_quoter.name;
let validator_param = field_quoter.quote_validator_param();
@@ -215,7 +215,7 @@ pub fn quote_url_validation(field_quoter: &FieldQuoter, validation: &FieldValida
field_quoter.wrap_if_option(quoted)
}
-pub fn quote_email_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> quote::Tokens {
+pub fn quote_email_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream {
let field_name = &field_quoter.name;
let validator_param = field_quoter.quote_validator_param();
@@ -231,12 +231,12 @@ pub fn quote_email_validation(field_quoter: &FieldQuoter, validation: &FieldVali
field_quoter.wrap_if_option(quoted)
}
-pub fn quote_must_match_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> quote::Tokens {
+pub fn quote_must_match_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream {
let ident = &field_quoter.ident;
let field_name = &field_quoter.name;
if let Validator::MustMatch(ref other) = validation.validator {
- let other_ident = syn::Ident::from(other.clone());
+ let other_ident = syn::Ident::new(other, Span::call_site());
let quoted_error = quote_error(&validation);
let quoted = quote!(
if !::validator::validate_must_match(&self.#ident, &self.#other_ident) {
@@ -253,7 +253,7 @@ pub fn quote_must_match_validation(field_quoter: &FieldQuoter, validation: &Fiel
unreachable!();
}
-pub fn quote_custom_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> quote::Tokens {
+pub fn quote_custom_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream {
let field_name = &field_quoter.name;
let validator_param = field_quoter.quote_validator_param();
@@ -282,7 +282,7 @@ pub fn quote_custom_validation(field_quoter: &FieldQuoter, validation: &FieldVal
unreachable!();
}
-pub fn quote_contains_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> quote::Tokens {
+pub fn quote_contains_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream {
let field_name = &field_quoter.name;
let validator_param = field_quoter.quote_validator_param();
@@ -303,7 +303,7 @@ pub fn quote_contains_validation(field_quoter: &FieldQuoter, validation: &FieldV
unreachable!();
}
-pub fn quote_regex_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> quote::Tokens {
+pub fn quote_regex_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream {
let field_name = &field_quoter.name;
let validator_param = field_quoter.quote_validator_param();
@@ -324,7 +324,7 @@ pub fn quote_regex_validation(field_quoter: &FieldQuoter, validation: &FieldVali
unreachable!();
}
-pub fn quote_field_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> quote::Tokens {
+pub fn quote_field_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream {
match validation.validator {
Validator::Length {..} => quote_length_validation(&field_quoter, validation),
Validator::Range {..} => quote_range_validation(&field_quoter, validation),
@@ -342,9 +342,9 @@ pub fn quote_field_validation(field_quoter: &FieldQuoter, validation: &FieldVali
}
-pub fn quote_schema_validation(validation: Option<SchemaValidation>) -> quote::Tokens {
+pub fn quote_schema_validation(validation: Option<SchemaValidation>) -> proc_macro2::TokenStream {
if let Some(v) = validation {
- let fn_ident = syn::Ident::from(v.function);
+ let fn_ident = syn::Ident::new(&v.function, Span::call_site());
let add_message_quoted = if let Some(ref m) = v.message {
quote!(err.message = Some(::std::borrow::Cow::from(#m));)
diff --git a/validator_derive/src/validation.rs b/validator_derive/src/validation.rs
index bd59428..227b9d9 100644
--- a/validator_derive/src/validation.rs
+++ b/validator_derive/src/validation.rs
@@ -45,7 +45,7 @@ pub fn extract_length_validation(field: String, meta_items: &Vec<syn::NestedMeta
for meta_item in meta_items {
if let syn::NestedMeta::Meta(ref item) = *meta_item {
if let syn::Meta::NameValue(syn::MetaNameValue { ref ident, ref lit, .. }) = *item {
- match ident.as_ref() {
+ match ident.to_string().as_ref() {
"message" | "code" => continue,
"min" => {
min = match lit_to_int(lit) {
@@ -109,7 +109,7 @@ pub fn extract_range_validation(field: String, meta_items: &Vec<syn::NestedMeta>
match *meta_item {
syn::NestedMeta::Meta(ref item) => match *item {
syn::Meta::NameValue(syn::MetaNameValue { ref ident, ref lit, .. }) => {
- match ident.as_ref() {
+ match ident.to_string().as_ref() {
"message" | "code" => continue,
"min" => {
min = match lit_to_float(lit) {
@@ -157,7 +157,7 @@ pub fn extract_argless_validation(validator_name: String, field: String, meta_it
match *meta_item {
syn::NestedMeta::Meta(ref item) => match *item {
syn::Meta::NameValue(syn::MetaNameValue { ref ident, .. }) => {
- match ident.as_ref() {
+ match ident.to_string().as_ref() {
"message" | "code" => continue,
v => panic!(
"Unknown argument `{}` for validator `{}` on field `{}`",
@@ -196,7 +196,7 @@ pub fn extract_one_arg_validation(val_name: &str, validator_name: String, field:
match *meta_item {
syn::NestedMeta::Meta(ref item) => match *item {
syn::Meta::NameValue(syn::MetaNameValue { ref ident, ref lit, .. }) => {
- match ident.as_ref() {
+ match ident.to_string().as_ref() {
"message" | "code" => continue,
v if v == val_name => {
value = match lit_to_string(lit) {
@@ -244,7 +244,7 @@ fn extract_message_and_code(validator_name: &str, field: &str, meta_items: &Vec<
for meta_item in meta_items {
if let syn::NestedMeta::Meta(syn::Meta::NameValue(syn::MetaNameValue { ref ident , ref lit, .. })) = *meta_item {
- match ident.as_ref() {
+ match ident.to_string().as_ref() {
"code" => {
code = match lit_to_string(lit) {
Some(s) => Some(s),