@@ -9,8 +9,8 @@ use crate::tools::SchemaDict;
9
9
use crate :: PydanticSerializationUnexpectedValue ;
10
10
11
11
use super :: {
12
- infer_json_key, infer_serialize, infer_to_python, py_err_se_err , BuildSerializer , CombinedSerializer , Extra ,
13
- SerCheck , TypeSerializer ,
12
+ infer_json_key, infer_serialize, infer_to_python, BuildSerializer , CombinedSerializer , Extra , SerCheck ,
13
+ TypeSerializer ,
14
14
} ;
15
15
16
16
#[ derive( Debug , Clone ) ]
@@ -84,7 +84,7 @@ impl TypeSerializer for UnionSerializer {
84
84
Ok ( v) => return Ok ( v) ,
85
85
Err ( err) => match err. is_instance_of :: < PydanticSerializationUnexpectedValue > ( value. py ( ) ) {
86
86
true => ( ) ,
87
- false => return Err ( err) ,
87
+ false => extra . warnings . custom_warning ( err. to_string ( ) ) ,
88
88
} ,
89
89
}
90
90
}
@@ -95,14 +95,15 @@ impl TypeSerializer for UnionSerializer {
95
95
Ok ( v) => return Ok ( v) ,
96
96
Err ( err) => match err. is_instance_of :: < PydanticSerializationUnexpectedValue > ( value. py ( ) ) {
97
97
true => ( ) ,
98
- false => return Err ( err) ,
98
+ false => extra . warnings . custom_warning ( err. to_string ( ) ) ,
99
99
} ,
100
100
}
101
101
}
102
102
}
103
103
104
104
extra. warnings . on_fallback_py ( self . get_name ( ) , value, extra) ?;
105
105
infer_to_python ( value, include, exclude, extra)
106
+ // Need to push all other errors if serialization didn't succeed
106
107
}
107
108
108
109
fn json_key < ' a > ( & self , key : & ' a Bound < ' _ , PyAny > , extra : & Extra ) -> PyResult < Cow < ' a , str > > {
@@ -111,21 +112,15 @@ impl TypeSerializer for UnionSerializer {
111
112
for comb_serializer in & self . choices {
112
113
match comb_serializer. json_key ( key, & new_extra) {
113
114
Ok ( v) => return Ok ( v) ,
114
- Err ( err) => match err. is_instance_of :: < PydanticSerializationUnexpectedValue > ( key. py ( ) ) {
115
- true => ( ) ,
116
- false => return Err ( err) ,
117
- } ,
115
+ Err ( err) => extra. warnings . custom_warning ( err. to_string ( ) ) ,
118
116
}
119
117
}
120
118
if self . retry_with_lax_check ( ) {
121
119
new_extra. check = SerCheck :: Lax ;
122
120
for comb_serializer in & self . choices {
123
121
match comb_serializer. json_key ( key, & new_extra) {
124
122
Ok ( v) => return Ok ( v) ,
125
- Err ( err) => match err. is_instance_of :: < PydanticSerializationUnexpectedValue > ( key. py ( ) ) {
126
- true => ( ) ,
127
- false => return Err ( err) ,
128
- } ,
123
+ Err ( err) => extra. warnings . custom_warning ( err. to_string ( ) ) ,
129
124
}
130
125
}
131
126
}
@@ -145,24 +140,19 @@ impl TypeSerializer for UnionSerializer {
145
140
let py = value. py ( ) ;
146
141
let mut new_extra = extra. clone ( ) ;
147
142
new_extra. check = SerCheck :: Strict ;
143
+
148
144
for comb_serializer in & self . choices {
149
145
match comb_serializer. to_python ( value, include, exclude, & new_extra) {
150
146
Ok ( v) => return infer_serialize ( v. bind ( py) , serializer, None , None , extra) ,
151
- Err ( err) => match err. is_instance_of :: < PydanticSerializationUnexpectedValue > ( py) {
152
- true => ( ) ,
153
- false => return Err ( py_err_se_err ( err) ) ,
154
- } ,
147
+ Err ( err) => extra. warnings . custom_warning ( err. to_string ( ) ) ,
155
148
}
156
149
}
157
150
if self . retry_with_lax_check ( ) {
158
151
new_extra. check = SerCheck :: Lax ;
159
152
for comb_serializer in & self . choices {
160
153
match comb_serializer. to_python ( value, include, exclude, & new_extra) {
161
154
Ok ( v) => return infer_serialize ( v. bind ( py) , serializer, None , None , extra) ,
162
- Err ( err) => match err. is_instance_of :: < PydanticSerializationUnexpectedValue > ( py) {
163
- true => ( ) ,
164
- false => return Err ( py_err_se_err ( err) ) ,
165
- } ,
155
+ Err ( err) => extra. warnings . custom_warning ( err. to_string ( ) ) ,
166
156
}
167
157
}
168
158
}
0 commit comments