File tree Expand file tree Collapse file tree 2 files changed +28
-7
lines changed Expand file tree Collapse file tree 2 files changed +28
-7
lines changed Original file line number Diff line number Diff line change @@ -929,7 +929,6 @@ fn deserialize_from_struct(
929
929
#visit_seq
930
930
931
931
#[ inline]
932
- #[ allow( unreachable_code) ]
933
932
fn visit_map<__A>( self , mut __map: __A) -> _serde:: export:: Result <Self :: Value , __A:: Error >
934
933
where __A: _serde:: de:: MapAccess <#delife>
935
934
{
@@ -2193,12 +2192,25 @@ fn deserialize_from_map(
2193
2192
. filter ( |& & ( field, _) | !field. attrs . skip_deserializing ( ) )
2194
2193
. map (
2195
2194
|& ( field, ref name) | {
2196
- let missing_expr = Expr ( expr_is_missing ( & field, cattrs) ) ;
2197
- let field_name = & field. ident ;
2198
- quote ! {
2199
- if !#name {
2200
- self . dest. #field_name = #missing_expr;
2201
- } ;
2195
+ let missing_expr = expr_is_missing ( & field, cattrs) ;
2196
+ // If missing_expr unconditionally returns an error, don't try
2197
+ // to assign its value to self.dest. Maybe this could be handled
2198
+ // more elegantly.
2199
+ if missing_expr. as_ref ( ) . as_str ( ) . starts_with ( "return " ) {
2200
+ let missing_expr = Stmts ( missing_expr) ;
2201
+ quote ! {
2202
+ if !#name {
2203
+ #missing_expr;
2204
+ }
2205
+ }
2206
+ } else {
2207
+ let field_name = & field. ident ;
2208
+ let missing_expr = Expr ( missing_expr) ;
2209
+ quote ! {
2210
+ if !#name {
2211
+ self . dest. #field_name = #missing_expr;
2212
+ } ;
2213
+ }
2202
2214
}
2203
2215
} ,
2204
2216
) ;
Original file line number Diff line number Diff line change @@ -73,3 +73,12 @@ impl ToTokens for Match {
73
73
}
74
74
}
75
75
}
76
+
77
+ impl AsRef < Tokens > for Fragment {
78
+ fn as_ref ( & self ) -> & Tokens {
79
+ match * self {
80
+ Fragment :: Expr ( ref expr) => expr,
81
+ Fragment :: Block ( ref block) => block,
82
+ }
83
+ }
84
+ }
You can’t perform that action at this time.
0 commit comments