Skip to content

Commit d5ff2cd

Browse files
committed
feat: add deprecated warning.
1 parent 815c6ce commit d5ff2cd

File tree

5 files changed

+79
-31
lines changed

5 files changed

+79
-31
lines changed

serde_valid_derive/src/attribute/common/message_format.rs

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
use crate::attribute::{MetaListCustomMessage, MetaNameValueCustomMessage, MetaPathCustomMessage};
22
use crate::types::{CommaSeparatedNestedMetas, NestedMeta, SingleIdentPath};
3+
use crate::warning::{Warning, WithWarnings};
34
use proc_macro2::TokenStream;
45
use quote::quote;
56
use std::str::FromStr;
7+
use syn::spanned::Spanned;
68

79
use super::lit::get_str;
810
pub type MessageFormat = TokenStream;
@@ -11,7 +13,9 @@ pub fn default_message_format() -> MessageFormat {
1113
quote!(::serde_valid::validation::error::Format::Default)
1214
}
1315

14-
pub fn extract_custom_message_format(meta: &syn::Meta) -> Result<MessageFormat, crate::Errors> {
16+
pub fn extract_custom_message_format(
17+
meta: &syn::Meta,
18+
) -> Result<WithWarnings<MessageFormat>, crate::Errors> {
1519
let custom_message_path = match meta {
1620
syn::Meta::Path(path) => path,
1721
syn::Meta::List(list) => &list.path,
@@ -60,15 +64,24 @@ pub fn extract_custom_message_format(meta: &syn::Meta) -> Result<MessageFormat,
6064
fn extract_custom_message_format_from_meta_list(
6165
custom_message_type: &MetaListCustomMessage,
6266
meta_list: &syn::MetaList,
63-
) -> Result<MessageFormat, crate::Errors> {
67+
) -> Result<WithWarnings<MessageFormat>, crate::Errors> {
6468
let path = &meta_list.path;
6569
let path_ident = SingleIdentPath::new(path).ident();
6670
let message_fn_define = meta_list
6771
.parse_args_with(CommaSeparatedNestedMetas::parse_terminated)
6872
.map_err(|error| vec![crate::Error::custom_message_parse_error(path_ident, &error)])?;
6973

7074
match custom_message_type {
71-
MetaListCustomMessage::MessageFn => get_message_fn_from_meta_list(path, &message_fn_define),
75+
MetaListCustomMessage::MessageFn => get_message_fn_from_meta_list(path, &message_fn_define)
76+
.map(|message_fn| {
77+
WithWarnings::new_with_warnings(
78+
message_fn,
79+
vec![Warning::new_message_fn_list_deprecated(
80+
path_ident,
81+
path.span(),
82+
)],
83+
)
84+
}),
7285
#[cfg(feature = "fluent")]
7386
message_type @ (MetaListCustomMessage::I18n | MetaListCustomMessage::Fluent) => {
7487
get_fluent_message(message_type, path, &message_fn_define)
@@ -79,7 +92,7 @@ fn extract_custom_message_format_from_meta_list(
7992
fn extract_custom_message_format_from_name_value(
8093
custom_message_type: &MetaNameValueCustomMessage,
8194
name_value: &syn::MetaNameValue,
82-
) -> Result<MessageFormat, crate::Errors> {
95+
) -> Result<WithWarnings<MessageFormat>, crate::Errors> {
8396
match custom_message_type {
8497
MetaNameValueCustomMessage::Message => get_message(&name_value.value),
8598
MetaNameValueCustomMessage::MessageFn => get_message_fn_from_meta_name_value(name_value),
@@ -113,7 +126,7 @@ fn get_message_fn_from_meta_list(
113126

114127
fn get_message_fn_from_meta_name_value(
115128
meta_name_value: &syn::MetaNameValue,
116-
) -> Result<TokenStream, crate::Errors> {
129+
) -> Result<WithWarnings<MessageFormat>, crate::Errors> {
117130
let fn_define = match &meta_name_value.value {
118131
syn::Expr::Path(syn::ExprPath { path, .. }) => quote!(#path),
119132
syn::Expr::Call(call) => quote!(#call),
@@ -123,13 +136,15 @@ fn get_message_fn_from_meta_name_value(
123136
])?,
124137
};
125138

126-
Ok(quote!(::serde_valid::validation::error::Format::MessageFn(#fn_define)))
139+
Ok(WithWarnings::new(
140+
quote!(::serde_valid::validation::error::Format::MessageFn(#fn_define)),
141+
))
127142
}
128143

129-
fn get_message(expr: &syn::Expr) -> Result<TokenStream, crate::Errors> {
144+
fn get_message(expr: &syn::Expr) -> Result<WithWarnings<MessageFormat>, crate::Errors> {
130145
match expr {
131146
syn::Expr::Lit(lit) => {
132-
get_str(&lit.lit).map(|lit_str| quote!(::serde_valid::validation::error::Format::Message(#lit_str.to_string())))
147+
get_str(&lit.lit).map(|lit_str| quote!(::serde_valid::validation::error::Format::Message(#lit_str.to_string()))).map(WithWarnings::new)
133148
}
134149
_ => Err(vec![crate::Error::literal_only(expr)]),
135150
}
@@ -140,7 +155,7 @@ fn get_fluent_message(
140155
message_type: &MetaListCustomMessage,
141156
path: &syn::Path,
142157
fn_define: &CommaSeparatedNestedMetas,
143-
) -> Result<MessageFormat, crate::Errors> {
158+
) -> Result<WithWarnings<MessageFormat>, crate::Errors> {
144159
use quote::ToTokens;
145160

146161
use crate::types::CommaSeparatedTokenStreams;
@@ -151,14 +166,14 @@ fn get_fluent_message(
151166
let id = get_fluent_id(&fn_define[0])
152167
.ok_or_else(|| vec![crate::Error::fluent_allow_key(message_type, &fn_define[0])])?;
153168

154-
Ok(quote!(
169+
Ok(WithWarnings::new(quote!(
155170
::serde_valid::validation::error::Format::Fluent(
156171
::serde_valid::fluent::Message{
157172
id: #id,
158173
args: vec![]
159174
}
160175
)
161-
))
176+
)))
162177
}
163178
_ => {
164179
let mut errors = vec![];
@@ -180,14 +195,14 @@ fn get_fluent_message(
180195
})
181196
.collect::<CommaSeparatedTokenStreams>();
182197
if errors.is_empty() {
183-
Ok(quote!(
198+
Ok(WithWarnings::new(quote!(
184199
::serde_valid::validation::error::Format::Fluent(
185200
::serde_valid::fluent::Message{
186201
id: #id,
187202
args: vec![#args]
188203
}
189204
)
190-
))
205+
)))
191206
} else {
192207
Err(errors)
193208
}

serde_valid_derive/src/attribute/field_validate/meta.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ fn inner_extract_field_validator(
5050
)]
5151
})?;
5252

53-
let message_format = match nested.len() {
53+
let WithWarnings {
54+
data: message_format,
55+
mut warnings,
56+
} = match nested.len() {
5457
0 => Err(vec![crate::Error::field_validation_type_required(
5558
attribute,
5659
)])?,
@@ -78,7 +81,7 @@ fn inner_extract_field_validator(
7881
None
7982
}
8083
}
81-
.unwrap_or_else(default_message_format);
84+
.unwrap_or_else(|| WithWarnings::new(default_message_format()));
8285

8386
let meta = &nested[0];
8487

@@ -146,12 +149,19 @@ fn inner_extract_field_validator(
146149
validation_path,
147150
&validation_name,
148151
)]),
149-
};
152+
}
153+
.map(|validator| {
154+
warnings.extend(validator.warnings);
155+
validator.data
156+
});
150157

151158
match validator {
152159
Ok(validator) => {
153160
if errors.is_empty() {
154-
Ok(validator)
161+
Ok(WithWarnings {
162+
data: validator,
163+
warnings,
164+
})
155165
} else {
156166
Err(errors)
157167
}

serde_valid_derive/src/attribute/struct_validate/meta.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ fn inner_extract_struct_validator(
4747
)]
4848
})?;
4949

50-
let message_format = match nested.len() {
50+
let WithWarnings {
51+
data: message_format,
52+
mut warnings,
53+
} = match nested.len() {
5154
0 => Err(vec![crate::Error::struct_validation_type_required(
5255
attribute,
5356
)])?,
@@ -75,7 +78,7 @@ fn inner_extract_struct_validator(
7578
None
7679
}
7780
}
78-
.unwrap_or_else(default_message_format);
81+
.unwrap_or_else(|| WithWarnings::new(default_message_format()));
7982

8083
let meta = &nested[0];
8184
let validation_path = match meta {
@@ -126,12 +129,19 @@ fn inner_extract_struct_validator(
126129
validation_path,
127130
&validation_name,
128131
)]),
129-
};
132+
}
133+
.map(|validator| {
134+
warnings.extend(validator.warnings);
135+
validator.data
136+
});
130137

131138
match validator {
132139
Ok(validator) => {
133140
if errors.is_empty() {
134-
Ok(validator)
141+
Ok(WithWarnings {
142+
data: validator,
143+
warnings,
144+
})
135145
} else {
136146
Err(errors)
137147
}

serde_valid_derive/src/attribute/variant_validate/meta.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ fn inner_extract_variant_validator(
4747
)]
4848
})?;
4949

50-
let message_format = match nested.len() {
50+
let WithWarnings {
51+
data: message_format,
52+
mut warnings,
53+
} = match nested.len() {
5154
0 => Err(vec![crate::Error::struct_validation_type_required(
5255
attribute,
5356
)])?,
@@ -75,7 +78,7 @@ fn inner_extract_variant_validator(
7578
None
7679
}
7780
}
78-
.unwrap_or_else(default_message_format);
81+
.unwrap_or_else(|| WithWarnings::new(default_message_format()));
7982

8083
let meta = &nested[0];
8184
let validation_path = match meta {
@@ -126,12 +129,19 @@ fn inner_extract_variant_validator(
126129
validation_path,
127130
&validation_name,
128131
)]),
129-
};
132+
}
133+
.map(|validator| {
134+
warnings.extend(validator.warnings);
135+
validator.data
136+
});
130137

131138
match validator {
132139
Ok(validator) => {
133140
if errors.is_empty() {
134-
Ok(validator)
141+
Ok(WithWarnings {
142+
data: validator,
143+
warnings,
144+
})
135145
} else {
136146
Err(errors)
137147
}

serde_valid_derive/src/warning.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,6 @@ impl<T> WithWarnings<T> {
3333
.collect::<Vec<_>>();
3434
WithWarnings { data, warnings }
3535
}
36-
37-
#[allow(unused)]
38-
pub fn extend_warnings(&mut self, warnings: Vec<Warning>) -> &mut Self {
39-
self.warnings.extend(warnings);
40-
self
41-
}
4236
}
4337

4438
impl<T> From<WithWarnings<T>> for WithWarnings<Vec<T>> {
@@ -125,6 +119,15 @@ impl Warning {
125119
}
126120
}
127121

122+
pub fn new_message_fn_list_deprecated(ident: &syn::Ident, span: Span) -> Self {
123+
Self::Deprecated {
124+
ident: ident.clone(),
125+
note: "#[validate(message_fn(...))] is deprecated, please use #[validate(message_fn = ...)] instead."
126+
.to_string(),
127+
span,
128+
}
129+
}
130+
128131
pub fn add_index(&self, index: usize) -> Self {
129132
match self {
130133
Self::Deprecated { ident, note, span } => Self::Deprecated {

0 commit comments

Comments
 (0)