@@ -6,7 +6,7 @@ use crate::parse::{Attribute, Category, Enum, Field, Struct, Type};
66
77use proc_macro:: TokenStream ;
88
9- use crate :: shared;
9+ use crate :: shared:: { self , attrs_skip } ;
1010
1111pub fn derive_ser_ron_proxy ( proxy_type : & str , type_ : & str , crate_name : & str ) -> TokenStream {
1212 format ! (
@@ -39,7 +39,7 @@ pub fn derive_de_ron_proxy(proxy_type: &str, type_: &str, crate_name: &str) -> T
3939pub fn derive_ser_ron_struct ( struct_ : & Struct , crate_name : & str ) -> TokenStream {
4040 let mut s = String :: new ( ) ;
4141
42- for field in & struct_. fields {
42+ for field in struct_. fields . iter ( ) . filter ( |f| ! attrs_skip ( & f . attributes ) ) {
4343 let struct_fieldname = field. field_name . clone ( ) . unwrap ( ) ;
4444 let ron_fieldname =
4545 shared:: attrs_rename ( & field. attributes ) . unwrap_or_else ( || struct_fieldname. clone ( ) ) ;
@@ -96,7 +96,12 @@ pub fn derive_ser_ron_struct_unnamed(struct_: &Struct, crate_name: &str) -> Toke
9696 let mut body = String :: new ( ) ;
9797
9898 let last = struct_. fields . len ( ) - 1 ;
99- for ( n, _) in struct_. fields . iter ( ) . enumerate ( ) {
99+ for ( n, _field) in struct_
100+ . fields
101+ . iter ( )
102+ . enumerate ( )
103+ . filter ( |( _, f) | !attrs_skip ( & f. attributes ) )
104+ {
100105 l ! ( body, "self.{}.ser_ron(d, s);" , n) ;
101106 if n != last {
102107 l ! ( body, "s.out.push_str(\" , \" );" ) ;
@@ -136,9 +141,11 @@ pub fn derive_de_ron_named(
136141 let container_attr_default = shared:: attrs_default ( attributes) . is_some ( ) ;
137142
138143 let mut unwraps = Vec :: new ( ) ;
139- for field in fields {
144+ for field in fields. iter ( ) {
140145 let struct_fieldname = field. field_name . as_ref ( ) . unwrap ( ) . to_string ( ) ;
141146 let localvar = format ! ( "_{}" , struct_fieldname) ;
147+ let field_is_option = field. ty . base ( ) == "Option" ;
148+ let field_attr_skip = shared:: attrs_skip ( & field. attributes ) ;
142149 let field_attr_default = shared:: attrs_default ( & field. attributes ) ;
143150 let field_attr_default_with = shared:: attrs_default_with ( & field. attributes ) ;
144151 let default_val = if let Some ( v) = field_attr_default {
@@ -149,40 +156,28 @@ pub fn derive_de_ron_named(
149156 val = format ! ( "Some({})" , val) ;
150157 }
151158 Some ( val)
152- } else if field . ty . base ( ) != "Option" {
159+ } else if !field_is_option {
153160 Some ( String :: from ( "Default::default()" ) )
154161 } else {
155162 Some ( String :: from ( "None" ) )
156163 }
157164 } else if let Some ( mut v) = field_attr_default_with {
158165 v. push_str ( "()" ) ;
159166 Some ( v)
167+ } else if container_attr_default || field_attr_skip || field_is_option {
168+ Some ( String :: from ( "Default::default()" ) )
160169 } else {
161170 None
162171 } ;
163- let ron_fieldname =
164- shared:: attrs_rename ( & field. attributes ) . unwrap_or ( struct_fieldname. clone ( ) ) ;
165- let skip = crate :: shared:: attrs_skip ( & field. attributes ) ;
166-
167- if !skip {
168- if field. ty . base ( ) == "Option" || container_attr_default || default_val. is_some ( ) {
169- if let Some ( default_val) = default_val {
170- unwraps. push ( format ! ( "{}.unwrap_or_else(|| {})" , localvar, default_val) ) ;
171- } else {
172- unwraps. push ( format ! ( "{}.unwrap_or_default()" , localvar) ) ;
173- }
174- } else {
175- unwraps. push ( format ! (
176- "{}.ok_or_else(|| s.err_nf(\" {}\" ))?" ,
177- localvar, struct_fieldname
178- ) ) ;
179- }
180- } else {
181- unwraps. push ( format ! (
182- "{{ {} }}" ,
183- default_val. as_deref( ) . unwrap_or( "Default::default()" )
184- ) ) ;
185- }
172+ let ron_fieldname =( !field_attr_skip) . then ( || shared:: attrs_rename ( & field. attributes ) . unwrap_or ( struct_fieldname. clone ( ) ) ) ;
173+
174+ unwraps. push ( match default_val {
175+ Some ( def) => format ! ( "{}.unwrap_or_else(|| {})" , localvar, def) ,
176+ None => format ! (
177+ "{}.ok_or_else(|| s.err_nf(\" {}\" ))?" ,
178+ localvar, struct_fieldname
179+ ) ,
180+ } ) ;
186181
187182 struct_field_names. push ( struct_fieldname) ;
188183 ron_field_names. push ( ron_fieldname) ;
@@ -203,6 +198,9 @@ pub fn derive_de_ron_named(
203198 let match_names = if !ron_field_names. is_empty ( ) {
204199 let mut inner = String :: new ( ) ;
205200 for ( ron_field_name, ( local_var, _) ) in ron_field_names. iter ( ) . zip ( local_vars. iter ( ) ) {
201+ let Some ( ron_field_name) = ron_field_name else {
202+ continue ;
203+ } ;
206204 l ! (
207205 inner,
208206 "\" {}\" => {{
0 commit comments