def deserialize_meta(cls, data):
t = getattr(cls, '__nirum_type__', None)
if t == 'union' or hasattr(cls, '__nirum_tag__') or hasattr(cls, 'Tag'):
d = deserialize_union_type(cls, data)
elif t == 'record' or hasattr(cls, '__nirum_record_behind_name__'):
d = deserialize_record_type(cls, data)
elif (t == 'unboxed' or hasattr(cls, '__nirum_get_inner_type__') or
hasattr(cls, '__nirum_inner_type__')):
d = deserialize_unboxed_type(cls, data)
elif type(cls) is typing.TupleMeta:
# typing.Tuple dosen't have either `__origin__` and `__args__`
# so it have to be handled special case.
d = deserialize_tuple_type(cls, data)
elif is_support_abstract_type(cls):
d = deserialize_abstract_type(cls, data)
elif is_union_type(cls):
d = deserialize_optional(cls, data)
elif callable(cls) and cls in _NIRUM_PRIMITIVE_TYPE:
d = deserialize_primitive(cls, data)
elif isinstance(cls, enum.EnumMeta):
d = cls(data)
else:
raise TypeError('data is not deserializable: {!r} as {!r}'.format(
data, cls
))
return d
评论列表
文章目录