@@ -89,35 +89,21 @@ fn process_fields<'a>(
8989 // Field value parsing — explicit turbofish types are required because
9090 // RPITIT opaque return types prevent the compiler from inferring
9191 // `TryFromFieldWithState::Self` through `.await`.
92- let parse_value = quote ! {
93- <#parse_ty as vespera:: multipart:: TryFromFieldWithState <__VesperaS__>>:: try_from_field_with_state(
94- __field__, #limit_tokens, __state__
95- ) . await ?
96- } ;
92+ let try_from_call = quote ! { <#parse_ty as vespera:: multipart:: TryFromFieldWithState <__VesperaS__>>:: try_from_field_with_state } ;
93+ let parse_value = quote ! { #try_from_call( __field__, #limit_tokens, __state__) . await ? } ;
9794
9895 let assignment = if is_vec {
9996 quote ! { #ident. push( #parse_value) ; }
10097 } else if strict {
101- quote ! {
102- if #ident. is_none( ) {
103- #ident = std:: option:: Option :: Some ( #parse_value) ;
104- } else {
105- return std:: result:: Result :: Err (
106- vespera:: multipart:: TypedMultipartError :: DuplicateField {
107- field_name: std:: string:: String :: from( #field_name)
108- }
109- ) ;
110- }
111- }
98+ let set_value = quote ! { #ident = std:: option:: Option :: Some ( #parse_value) } ;
99+ let dup_err = quote ! { return std:: result:: Result :: Err ( vespera:: multipart:: TypedMultipartError :: DuplicateField { field_name: std:: string:: String :: from( #field_name) } ) } ;
100+ quote ! { if #ident. is_none( ) { #set_value ; } else { #dup_err ; } }
112101 } else {
113102 quote ! { #ident = std:: option:: Option :: Some ( #parse_value) ; }
114103 } ;
115104
116- cg. assignments . push ( quote ! {
117- if __field_name__ == #field_name {
118- #assignment
119- }
120- } ) ;
105+ let field_match = quote ! { if __field_name__ == #field_name { #assignment } } ;
106+ cg. assignments . push ( field_match) ;
121107
122108 // Post-loop: required field checks / defaults
123109 if !is_option && !is_vec {
0 commit comments