|
23 | 23 | from buf.validate import validate_pb2 # type: ignore |
24 | 24 | from protovalidate.internal.cel_field_presence import InterpretedRunner, in_has |
25 | 25 |
|
| 26 | +# Convenience to stringify the type names for error messages |
| 27 | +FIELD_TYPE_NAMES = {v: k for k, v in vars(descriptor.FieldDescriptor).items() if k.startswith("TYPE_")} |
| 28 | + |
26 | 29 |
|
27 | 30 | class CompilationError(Exception): |
28 | 31 | pass |
@@ -397,7 +400,15 @@ def check_field_type(field: descriptor.FieldDescriptor, expected: int, wrapper_n |
397 | 400 | if field.type != expected and ( |
398 | 401 | field.type != descriptor.FieldDescriptor.TYPE_MESSAGE or field.message_type.full_name != wrapper_name |
399 | 402 | ): |
400 | | - msg = f"field {field.name} has type {field.type} but expected {expected}" |
| 403 | + field_type_str = FIELD_TYPE_NAMES[field.type] |
| 404 | + if expected == 0: |
| 405 | + if wrapper_name is not None: |
| 406 | + expected_type_str = wrapper_name |
| 407 | + else: |
| 408 | + expected_type_str = FIELD_TYPE_NAMES[descriptor.FieldDescriptor.TYPE_MESSAGE] |
| 409 | + else: |
| 410 | + expected_type_str = FIELD_TYPE_NAMES[expected] |
| 411 | + msg = f"field {field.name} has type {field_type_str} but expected {expected_type_str}" |
401 | 412 | raise CompilationError(msg) |
402 | 413 |
|
403 | 414 |
|
@@ -821,6 +832,7 @@ def _new_scalar_field_rule( |
821 | 832 | if field_level.ignore == validate_pb2.IGNORE_ALWAYS: |
822 | 833 | return None |
823 | 834 | type_case = field_level.WhichOneof("type") |
| 835 | + # print(f"type case is {type_case}") |
824 | 836 | if type_case is None: |
825 | 837 | result = FieldRules(self._env, self._funcs, field, field_level, for_items=for_items) |
826 | 838 | return result |
@@ -929,7 +941,7 @@ def _new_scalar_field_rule( |
929 | 941 | result = FieldRules(self._env, self._funcs, field, field_level, for_items=for_items) |
930 | 942 | return result |
931 | 943 | elif type_case == "any": |
932 | | - check_field_type(field, descriptor.FieldDescriptor.TYPE_MESSAGE, "google.protobuf.Any") |
| 944 | + check_field_type(field, 0, "google.protobuf.Any") |
933 | 945 | result = AnyRules(self._env, self._funcs, field, field_level) |
934 | 946 | return result |
935 | 947 |
|
|
0 commit comments