Source code for typedpy.fields.fields
"""
Definitions of various types of fields. Supports JSON draft4 types.
"""
import typing
from functools import reduce
from typedpy.commons import wrap_val
from typedpy.structures import ClassReference, Field, StructMeta, TypedField
def _map_to_field(item):
item = item[0] if isinstance(item, (list, tuple)) and len(item) == 1 else item
if isinstance(item, StructMeta) and not isinstance(item, Field):
return ClassReference(item)
if item in [None, ""] or isinstance(item, Field):
return item
elif Field in getattr(item, "__mro__", []):
return item()
else:
raise TypeError("Expected a Field/Structure class or Field instance")
class StructureClass(TypedField):
_ty = StructMeta
[docs]class Generator(TypedField):
"""
A Python generator. Not serializable.
"""
_ty = typing.Generator
def verify_type_and_uniqueness(the_type, value, name, has_unique_items):
if not isinstance(value, the_type):
raise TypeError(f"{name}: Got {wrap_val(value)}; Expected {str(the_type)}")
if has_unique_items:
unique = reduce(
lambda unique_vals, x: unique_vals.append(x) or unique_vals
if x not in unique_vals
else unique_vals,
value,
[],
)
if len(unique) < len(value):
raise ValueError(f"{name}: Got {wrap_val(value)}; Expected unique items")