in pyiceberg/schema.py [0:0]
def _validate_identifier_field(self, field_id: int) -> None:
"""Validate that the field with the given ID is a valid identifier field.
Args:
field_id: The ID of the field to validate.
Raises:
ValueError: If the field is not valid.
"""
field = self.find_field(field_id)
if not field.field_type.is_primitive:
raise ValueError(f"Identifier field {field_id} invalid: not a primitive type field")
if not field.required:
raise ValueError(f"Identifier field {field_id} invalid: not a required field")
if isinstance(field.field_type, (DoubleType, FloatType)):
raise ValueError(f"Identifier field {field_id} invalid: must not be float or double field")
# Check whether the nested field is in a chain of required struct fields
# Exploring from root for better error message for list and map types
parent_id = self._lazy_id_to_parent.get(field.field_id)
fields: List[int] = []
while parent_id is not None:
fields.append(parent_id)
parent_id = self._lazy_id_to_parent.get(parent_id)
while fields:
parent = self.find_field(fields.pop())
if not parent.field_type.is_struct:
raise ValueError(f"Cannot add field {field.name} as an identifier field: must not be nested in {parent}")
if not parent.required:
raise ValueError(
f"Cannot add field {field.name} as an identifier field: must not be nested in an optional field {parent}"
)