@@ -21,7 +21,24 @@ pub fn do_derive_schema(input: DeriveInput) -> syn::Result<TokenStream> {
2121 } ;
2222 let ( impl_generics, ty_generics, where_clause) = generics. split_for_impl ( ) ;
2323
24- let ty = generator. generate_type ( & input. data , span, name. to_string ( ) ) ?;
24+ let mut rename = None ;
25+ for attr in & input. attrs {
26+ if attr. path ( ) . is_ident ( "serde" ) {
27+ // Parsing a serde attribute should not fail; if it does, we don't care about the attribute
28+ let _: syn:: Result < ( ) > = attr. parse_nested_meta ( |meta| {
29+ // #[serde(rename = "name")]
30+ if meta. path . is_ident ( "rename" ) {
31+ rename = Some ( meta. value ( ) ?. parse :: < syn:: LitStr > ( ) ?. value ( ) ) ;
32+ }
33+ Ok ( ( ) )
34+ } ) ;
35+ }
36+ }
37+ let ty = generator. generate_type (
38+ & input. data ,
39+ span,
40+ rename. unwrap_or_else ( || name. to_string ( ) ) ,
41+ ) ?;
2542
2643 let postcard_schema = & generator. postcard_schema ;
2744 let insta_test = generator. generate_snapshot_test ( name) ;
@@ -125,7 +142,21 @@ impl Generator {
125142 }
126143 Data :: Enum ( data) => {
127144 let variants = data. variants . iter ( ) . map ( |v| {
128- let ( name, data) = ( v. ident . to_string ( ) , self . generate_variants ( & v. fields ) ) ;
145+ let mut rename = None ;
146+ for attr in & v. attrs {
147+ if attr. path ( ) . is_ident ( "serde" ) {
148+ // Parsing a serde attribute should not fail; if it does, we don't care about the attribute
149+ let _: syn:: Result < ( ) > = attr. parse_nested_meta ( |meta| {
150+ // #[serde(rename = "name")]
151+ if meta. path . is_ident ( "rename" ) {
152+ rename = Some ( meta. value ( ) ?. parse :: < syn:: LitStr > ( ) ?. value ( ) ) ;
153+ }
154+ Ok ( ( ) )
155+ } ) ;
156+ }
157+ }
158+ let name = rename. unwrap_or_else ( || v. ident . to_string ( ) ) ;
159+ let data = self . generate_variants ( & v. fields ) ;
129160 quote ! { #postcard_schema:: schema:: Variant { name: #name, data: #data } }
130161 } ) ;
131162
@@ -147,27 +178,19 @@ impl Generator {
147178 let postcard_schema = & self . postcard_schema ;
148179 match fields {
149180 syn:: Fields :: Named ( fields) => {
150- let fields = fields. named . iter ( ) . map ( |f| {
151- let ty = & f. ty ;
152- let name = f. ident . as_ref ( ) . unwrap ( ) . to_string ( ) ;
153- quote_spanned ! ( f. span( ) => & #postcard_schema:: schema:: NamedField { name: #name, ty: <#ty as #postcard_schema:: Schema >:: SCHEMA } )
154- } ) ;
181+ let fields = fields. named . iter ( ) . map ( |f| self . generate_field ( f) ) ;
155182 quote ! { #postcard_schema:: schema:: Data :: Struct ( & [
156183 #( #fields ) , *
157184 ] ) }
158185 }
159186 syn:: Fields :: Unnamed ( fields) => {
160187 if fields. unnamed . len ( ) == 1 {
161- let f = fields. unnamed [ 0 ] . clone ( ) ;
162- let ty = & f. ty ;
163- let qs = quote_spanned ! ( f. span( ) => <#ty as #postcard_schema:: Schema >:: SCHEMA ) ;
188+ let f = & fields. unnamed [ 0 ] ;
189+ let inner = self . generate_field ( f) ;
164190
165- quote ! { #postcard_schema:: schema:: Data :: Newtype ( #qs ) }
191+ quote ! { #postcard_schema:: schema:: Data :: Newtype ( #inner ) }
166192 } else {
167- let fields = fields. unnamed . iter ( ) . map ( |f| {
168- let ty = & f. ty ;
169- quote_spanned ! ( f. span( ) => <#ty as #postcard_schema:: Schema >:: SCHEMA )
170- } ) ;
193+ let fields = fields. unnamed . iter ( ) . map ( |f| self . generate_field ( f) ) ;
171194 quote ! { #postcard_schema:: schema:: Data :: Tuple ( & [
172195 #( #fields ) , *
173196 ] ) }
@@ -183,27 +206,19 @@ impl Generator {
183206 let postcard_schema = & self . postcard_schema ;
184207 match fields {
185208 syn:: Fields :: Named ( fields) => {
186- let fields = fields. named . iter ( ) . map ( |f| {
187- let ty = & f. ty ;
188- let name = f. ident . as_ref ( ) . unwrap ( ) . to_string ( ) ;
189- quote_spanned ! ( f. span( ) => & #postcard_schema:: schema:: NamedField { name: #name, ty: <#ty as #postcard_schema:: Schema >:: SCHEMA } )
190- } ) ;
209+ let fields = fields. named . iter ( ) . map ( |f| self . generate_field ( f) ) ;
191210 quote ! { #postcard_schema:: schema:: Data :: Struct ( & [
192211 #( #fields ) , *
193212 ] ) }
194213 }
195214 syn:: Fields :: Unnamed ( fields) => {
196215 if fields. unnamed . len ( ) == 1 {
197- let f = fields. unnamed [ 0 ] . clone ( ) ;
198- let ty = & f. ty ;
199- let qs = quote_spanned ! ( f. span( ) => <#ty as #postcard_schema:: Schema >:: SCHEMA ) ;
216+ let f = & fields. unnamed [ 0 ] ;
217+ let inner = self . generate_field ( f) ;
200218
201- quote ! { #postcard_schema:: schema:: Data :: Newtype ( #qs ) }
219+ quote ! { #postcard_schema:: schema:: Data :: Newtype ( #inner ) }
202220 } else {
203- let fields = fields. unnamed . iter ( ) . map ( |f| {
204- let ty = & f. ty ;
205- quote_spanned ! ( f. span( ) => <#ty as #postcard_schema:: Schema >:: SCHEMA )
206- } ) ;
221+ let fields = fields. unnamed . iter ( ) . map ( |f| self . generate_field ( f) ) ;
207222 quote ! { #postcard_schema:: schema:: Data :: Tuple ( & [
208223 #( #fields ) , *
209224 ] ) }
@@ -215,6 +230,31 @@ impl Generator {
215230 }
216231 }
217232
233+ fn generate_field ( & self , field : & syn:: Field ) -> TokenStream {
234+ let postcard_schema = & self . postcard_schema ;
235+ let ty = & field. ty ;
236+ match & field. ident {
237+ None => quote_spanned ! ( field. span( ) => <#ty as #postcard_schema:: Schema >:: SCHEMA ) ,
238+ Some ( name) => {
239+ let mut rename = None ;
240+ for attr in & field. attrs {
241+ if attr. path ( ) . is_ident ( "serde" ) {
242+ // Parsing a serde attribute should not fail; if it does, we don't care about the attribute
243+ let _: syn:: Result < ( ) > = attr. parse_nested_meta ( |meta| {
244+ // #[serde(rename = "name")]
245+ if meta. path . is_ident ( "rename" ) {
246+ rename = Some ( meta. value ( ) ?. parse :: < syn:: LitStr > ( ) ?. value ( ) ) ;
247+ }
248+ Ok ( ( ) )
249+ } ) ;
250+ }
251+ }
252+ let name = rename. unwrap_or_else ( || name. to_string ( ) ) ;
253+ quote_spanned ! ( field. span( ) => & #postcard_schema:: schema:: NamedField { name: #name, ty: <#ty as #postcard_schema:: Schema >:: SCHEMA } )
254+ }
255+ }
256+ }
257+
218258 /// Add a bound `T: Schema` to every type parameter T.
219259 fn add_trait_bounds ( & self , mut generics : Generics ) -> Generics {
220260 let postcard_schema = & self . postcard_schema ;
0 commit comments