Skip to content

Commit 0fc9616

Browse files
committed
collect errors at the end :)
1 parent 1e3ed7d commit 0fc9616

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

src/serializers/type_serializers/union.rs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,14 @@ impl TypeSerializer for UnionSerializer {
7878
// try the serializers in left to right order with error_on fallback=true
7979
let mut new_extra = extra.clone();
8080
new_extra.check = SerCheck::Strict;
81+
let mut errors: Vec<PyErr> = Vec::new();
8182

8283
for comb_serializer in &self.choices {
8384
match comb_serializer.to_python(value, include, exclude, &new_extra) {
8485
Ok(v) => return Ok(v),
8586
Err(err) => match err.is_instance_of::<PydanticSerializationUnexpectedValue>(value.py()) {
8687
true => (),
87-
false => extra.warnings.custom_warning(err.to_string()),
88+
false => errors.push(err),
8889
},
8990
}
9091
}
@@ -95,25 +96,31 @@ impl TypeSerializer for UnionSerializer {
9596
Ok(v) => return Ok(v),
9697
Err(err) => match err.is_instance_of::<PydanticSerializationUnexpectedValue>(value.py()) {
9798
true => (),
98-
false => extra.warnings.custom_warning(err.to_string()),
99+
false => errors.push(err),
99100
},
100101
}
101102
}
102103
}
103104

105+
for err in &errors {
106+
extra.warnings.custom_warning(err.to_string());
107+
}
108+
104109
extra.warnings.on_fallback_py(self.get_name(), value, extra)?;
105110
infer_to_python(value, include, exclude, extra)
106111
}
107112

108113
fn json_key<'a>(&self, key: &'a Bound<'_, PyAny>, extra: &Extra) -> PyResult<Cow<'a, str>> {
109114
let mut new_extra = extra.clone();
110115
new_extra.check = SerCheck::Strict;
116+
let mut errors: Vec<PyErr> = Vec::new();
117+
111118
for comb_serializer in &self.choices {
112119
match comb_serializer.json_key(key, &new_extra) {
113120
Ok(v) => return Ok(v),
114121
Err(err) => match err.is_instance_of::<PydanticSerializationUnexpectedValue>(key.py()) {
115122
true => (),
116-
false => extra.warnings.custom_warning(err.to_string()),
123+
false => errors.push(err),
117124
},
118125
}
119126
}
@@ -124,12 +131,16 @@ impl TypeSerializer for UnionSerializer {
124131
Ok(v) => return Ok(v),
125132
Err(err) => match err.is_instance_of::<PydanticSerializationUnexpectedValue>(key.py()) {
126133
true => (),
127-
false => extra.warnings.custom_warning(err.to_string()),
134+
false => errors.push(err),
128135
},
129136
}
130137
}
131138
}
132139

140+
for err in &errors {
141+
extra.warnings.custom_warning(err.to_string());
142+
}
143+
133144
extra.warnings.on_fallback_py(self.get_name(), key, extra)?;
134145
infer_json_key(key, extra)
135146
}
@@ -145,13 +156,14 @@ impl TypeSerializer for UnionSerializer {
145156
let py = value.py();
146157
let mut new_extra = extra.clone();
147158
new_extra.check = SerCheck::Strict;
159+
let mut errors: Vec<PyErr> = Vec::new();
148160

149161
for comb_serializer in &self.choices {
150162
match comb_serializer.to_python(value, include, exclude, &new_extra) {
151163
Ok(v) => return infer_serialize(v.bind(py), serializer, None, None, extra),
152164
Err(err) => match err.is_instance_of::<PydanticSerializationUnexpectedValue>(value.py()) {
153165
true => (),
154-
false => extra.warnings.custom_warning(err.to_string()),
166+
false => errors.push(err),
155167
},
156168
}
157169
}
@@ -162,12 +174,16 @@ impl TypeSerializer for UnionSerializer {
162174
Ok(v) => return infer_serialize(v.bind(py), serializer, None, None, extra),
163175
Err(err) => match err.is_instance_of::<PydanticSerializationUnexpectedValue>(value.py()) {
164176
true => (),
165-
false => extra.warnings.custom_warning(err.to_string()),
177+
false => errors.push(err),
166178
},
167179
}
168180
}
169181
}
170182

183+
for err in &errors {
184+
extra.warnings.custom_warning(err.to_string());
185+
}
186+
171187
extra.warnings.on_fallback_ser::<S>(self.get_name(), value, extra)?;
172188
infer_serialize(value, serializer, include, exclude, extra)
173189
}

tests/serializers/test_union.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,5 +647,6 @@ def test_custom_serializer() -> None:
647647
]
648648
)
649649
)
650+
print(s)
650651
assert s.to_python([{'id': 1}, {'id': 2}]) == [1, 2]
651652
assert s.to_python({'id': 1}) == 1

0 commit comments

Comments
 (0)