code: def from_field_type_proto(field_type):
      from pyflink.fn_execution import flink_fn_execution_pb2
  
      schema_type_name = flink_fn_execution_pb2.Schema
  
      type_name = field_type.type_name
      if type_name == schema_type_name.ROW:
          return RowDataConverter(
              [
                  from_field_type_proto(f.type)
                  for f in field_type.row_schema.fields
              ],
              [f.name for f in field_type.row_schema.fields],
          )
      elif type_name == schema_type_name.BASIC_ARRAY:
          return ArrayDataConverter(
              from_field_type_proto(field_type.collection_element_type)
          )
      elif type_name == schema_type_name.MAP:
          return DictDataConverter(
              from_field_type_proto(field_type.map_info.key_type),
              from_field_type_proto(field_type.map_info.value_type),
          )
  
      return IdentityDataConverter()
  
imports: import pickle
  from abc import ABC, abstractmethod
  from typing import TypeVar, List, Tuple
  from pemja import findClass
  from pyflink.common import Row, RowKind, TypeInformation
  from pyflink.common.typeinfo import PickledBytesTypeInfo, PrimitiveArrayTypeInfo, BasicArrayTypeInfo, ObjectArrayTypeInfo, RowTypeInfo, TupleTypeInfo, MapTypeInfo, ListTypeInfo
  from pyflink.datastream import TimeWindow, CountWindow, GlobalWindow
label_desc: Use image node_id 3 for calling a global function with example usage: from_field_type_proto(field_type) and returns: IdentityDataConverter, RowDataConverter, ArrayDataConverter, DictDataConverter