| 871 | |
| 872 | |
| 873 | class StructFieldSerializerVisitor(TypeVisitor): |
| 874 | def __init__( |
| 875 | self, |
| 876 | type_resolver, |
| 877 | ): |
| 878 | self.type_resolver = type_resolver |
| 879 | |
| 880 | def visit_array(self, field_name, elem_type, carrier, types_path=None): |
| 881 | type_id = _array_type_id(elem_type, carrier) |
| 882 | from pyfory.serializer import ( |
| 883 | ForyArrayFieldSerializer, |
| 884 | Numpy1DArraySerializer, |
| 885 | PyArraySerializer, |
| 886 | fory_array_wrapper_type, |
| 887 | typecode_dict, |
| 888 | typeid_code, |
| 889 | ) |
| 890 | |
| 891 | if carrier == "array": |
| 892 | wrapper_type = fory_array_wrapper_type(type_id) |
| 893 | return ForyArrayFieldSerializer(self.type_resolver, wrapper_type, type_id, field_name) |
| 894 | if carrier == "pyarray": |
| 895 | typecode = typeid_code.get(type_id) |
| 896 | if typecode is None: |
| 897 | raise TypeError(f"pyfory.PyArray does not support array type id {type_id}") |
| 898 | _itemsize, ftype, _type_id = typecode_dict[typecode] |
| 899 | return PyArraySerializer(self.type_resolver, ftype, type_id) |
| 900 | if carrier == "ndarray": |
| 901 | for dtype, (_itemsize, _format, ftype, dtype_type_id) in Numpy1DArraySerializer.dtypes_dict.items(): |
| 902 | if dtype_type_id == type_id: |
| 903 | if ENABLE_FORY_CYTHON_SERIALIZATION: |
| 904 | from pyfory.serialization import Numpy1DArraySerializer as Numpy1DArrayRuntimeSerializer |
| 905 | |
| 906 | return Numpy1DArrayRuntimeSerializer(self.type_resolver, ftype, dtype) |
| 907 | return Numpy1DArraySerializer(self.type_resolver, ftype, dtype) |
| 908 | raise TypeError(f"pyfory.NDArray does not support array type id {type_id}") |
| 909 | raise TypeError(f"Unknown array carrier {carrier!r}") |
| 910 | |
| 911 | def visit_list(self, field_name, elem_type, types_path=None): |
| 912 | from pyfory.serializer import ListSerializer # Local import |
| 913 | from pyfory.type_util import unwrap_ref |
| 914 | |
| 915 | # Infer type recursively for type such as List[Dict[str, str]] |
| 916 | elem_type, elem_ref_override = unwrap_ref(elem_type) |
| 917 | elem_serializer = infer_field("item", elem_type, self, types_path=types_path) |
| 918 | return ListSerializer(self.type_resolver, list, elem_serializer, elem_ref_override) |
| 919 | |
| 920 | def visit_set(self, field_name, elem_type, types_path=None): |
| 921 | from pyfory.serializer import SetSerializer # Local import |
| 922 | from pyfory.type_util import unwrap_ref |
| 923 | |
| 924 | # Infer type recursively for type such as Set[Dict[str, str]] |
| 925 | elem_type, elem_ref_override = unwrap_ref(elem_type) |
| 926 | elem_serializer = infer_field("item", elem_type, self, types_path=types_path) |
| 927 | return SetSerializer(self.type_resolver, set, elem_serializer, elem_ref_override) |
| 928 | |
| 929 | def visit_tuple(self, field_name, elem_types, types_path=None): |
| 930 | from pyfory.serializer import TupleSerializer # Local import |
no outgoing calls
no test coverage detected