1414
1515from tilebox .datasets .data .datapoint import Datapoint , DatapointPage
1616from tilebox .datasets .message_pool import get_message_type
17- from tilebox .datasets .protobuf_conversion .field_types import ProtobufFieldType , ProtoFieldValue , infer_field_type
17+ from tilebox .datasets .protobuf_conversion .field_types import (
18+ EnumField ,
19+ ProtobufFieldType ,
20+ ProtoFieldValue ,
21+ enum_mapping_from_field_descriptor ,
22+ infer_field_type ,
23+ )
1824
1925AnyMessage = TypeVar ("AnyMessage" , bound = Message )
2026
@@ -375,21 +381,13 @@ def __init__(self, field_name: str, enum_names: dict[int, str]) -> None:
375381 Args:
376382 field_name: The name of enum field in the protobuf message
377383 """
378- super ().__init__ (field_name , ProtobufFieldType ( np . uint8 )) # we support up to 256 different enum values for now
384+ super ().__init__ (field_name , EnumField ( enum_names ))
379385 self ._enum_names = enum_names
380386
381387 def finalize (self , dataset : xr .Dataset , count : int , dimension_names : tuple [str , ...]) -> str | None :
382388 field_name = super ().finalize (dataset , count , dimension_names )
383389 if field_name is not None :
384- # convert the numeric enum values to the corresponding string names
385- int_values = dataset [field_name ]
386- dataset [field_name ] = (
387- int_values .dims ,
388- np .vectorize (lambda i : self ._enum_names .get (i , "" ))(int_values .values ),
389- )
390- dataset [field_name ].attrs ["enum_dict" ] = ";" .join (
391- f"{ name } : { value } " for value , name in self ._enum_names .items ()
392- )
390+ dataset [field_name ].attrs ["names" ] = self ._enum_names
393391 return field_name
394392
395393
@@ -418,22 +416,6 @@ def _create_field_converters(message: Message, buffer_size: int) -> dict[str, _F
418416 return converters
419417
420418
421- def _camel_to_uppercase (name : str ) -> str :
422- """Convert a camelCase name to an UPPER_CASE name.
423-
424- Args:
425- name: The name to convert.
426-
427- Returns:
428- The converted name.
429-
430- Examples:
431- >>> _camel_to_uppercase("ProcessingLevel")
432- 'PROCESSING_LEVEL'
433- """
434- return "" .join (["_" + c .lower () if c .isupper () else c for c in name ]).lstrip ("_" ).upper ()
435-
436-
437419def _create_field_converter (field : FieldDescriptor ) -> _FieldConverter :
438420 """
439421 Create a field converter for the given protobuf field descriptor.
@@ -450,12 +432,7 @@ def _create_field_converter(field: FieldDescriptor) -> _FieldConverter:
450432 if field .label == FieldDescriptor .LABEL_REPEATED :
451433 raise NotImplementedError ("Repeated enum fields are not supported" )
452434
453- # remove the enum type prefix from the enum values
454- enum_type_prefix = _camel_to_uppercase (field .enum_type .name ) + "_"
455- return _EnumFieldConverter (
456- field .name ,
457- {v .number : str (v .name ).removeprefix (enum_type_prefix ) for v in field .enum_type .values },
458- )
435+ return _EnumFieldConverter (field .name , enum_mapping_from_field_descriptor (field ))
459436
460437 field_type = infer_field_type (field )
461438 if field .label == FieldDescriptor .LABEL_OPTIONAL : # simple fields (in proto3 every simple field is optional)
0 commit comments