Skip to content

Commit

Permalink
Add non-greedy union support
Browse files Browse the repository at this point in the history
  • Loading branch information
dkraczkowski committed Nov 14, 2023
1 parent 5f583f7 commit 4188aa7
Showing 1 changed file with 22 additions and 6 deletions.
28 changes: 22 additions & 6 deletions chili/decoder.py
Original file line number Diff line number Diff line change
Expand Up @@ -323,14 +323,30 @@ def decode(self, value: Any) -> Any:

if passed_type is dict:
provided_fields = set(value.keys())
for class_name, decoder in self._type_decoders.items():
if self.force:
decoders = self._type_decoders
else:
decoders = {
class_name: decoder
for class_name, decoder in self._type_decoders.items()
if is_decodable(class_name) or is_dataclass(class_name)
}
# Greedy matching
for class_name, decoder in decoders.items():
expected_fields = set(get_non_optional_fields(class_name))
if not provided_fields.issubset(expected_fields):
continue
try:
if is_decodable(class_name) or is_dataclass(class_name) or self.force:
expected_fields = set(get_non_optional_fields(class_name))
if provided_fields.issubset(expected_fields):
return decoder.decode(value)
continue
return decoder.decode(value)
except Exception:
continue
# Non-greedy matching
for class_name, decoder in decoders.items():
expected_fields = set(get_non_optional_fields(class_name))
if not expected_fields.issubset(provided_fields):
continue
try:
return decoder.decode(value)
except Exception:
continue

Expand Down

0 comments on commit 4188aa7

Please sign in to comment.