Source code for pydantic_xml.serializers.encoder

from typing import Any, Callable, Optional, Set


[docs]class XmlEncoder: """ Xml data encoder. """ def __init__(self, default: Optional[Callable[[Any], Any]] = None): self._default = default
[docs] def encode(self, obj: Any) -> str: """ Encodes provided object into a string :param obj: object to be encoded :return: encoded object """ return self._encode(obj, set())
def _encode(self, obj: Any, seen_values: Set[int]) -> str: if isinstance(obj, str): return obj if isinstance(obj, bool): return str(obj).lower() if isinstance(obj, int): # int.__repr__ is used to correctly encode int-derived types, for example enum.IntEnum return str(int.__repr__(obj)) if isinstance(obj, float): return str(obj) value = self.default(obj) value_id = id(value) if value_id in seen_values: raise ValueError("Circular reference detected") else: seen_values.add(value_id) return self._encode(value, seen_values) def default(self, obj: Any) -> Any: if self._default is not None: try: return self._default(obj) except TypeError: pass raise TypeError(f"Object of type '{obj.__class__.__name__}' is not XML serializable")
DEFAULT_ENCODER = XmlEncoder()