| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- from __future__ import annotations
- import collections
- import collections.abc
- import typing
- from typing import Any
- from pydantic_core import PydanticOmit, core_schema
- SEQUENCE_ORIGIN_MAP: dict[Any, Any] = {
- typing.Deque: collections.deque,
- collections.deque: collections.deque,
- list: list,
- typing.List: list,
- set: set,
- typing.AbstractSet: set,
- typing.Set: set,
- frozenset: frozenset,
- typing.FrozenSet: frozenset,
- typing.Sequence: list,
- typing.MutableSequence: list,
- typing.MutableSet: set,
- # this doesn't handle subclasses of these
- # parametrized typing.Set creates one of these
- collections.abc.MutableSet: set,
- collections.abc.Set: frozenset,
- }
- def serialize_sequence_via_list(
- v: Any, handler: core_schema.SerializerFunctionWrapHandler, info: core_schema.SerializationInfo
- ) -> Any:
- items: list[Any] = []
- mapped_origin = SEQUENCE_ORIGIN_MAP.get(type(v), None)
- if mapped_origin is None:
- # we shouldn't hit this branch, should probably add a serialization error or something
- return v
- for index, item in enumerate(v):
- try:
- v = handler(item, index)
- except PydanticOmit:
- pass
- else:
- items.append(v)
- if info.mode_is_json():
- return items
- else:
- return mapped_origin(items)
|