Source code for ifgen.environment.field

"""
A module implementing interfaces for processing individual struct fields.
"""

# built-in
from typing import Any, Iterator

# third-party
from runtimepy.codec.system import TypeSystem

# internal
from ifgen.environment.padding import PaddingManager, StructField, type_string


[docs] def process_field( struct_name: str, padding: PaddingManager, types: TypeSystem, field: dict[str, Any], namespace: list[str], ) -> Iterator[StructField]: """Process a single struct field.""" field_name = field["name"] # Validate expected offset. if "expected_offset" in field: size = types.size(struct_name, *namespace) expected: int = field["expected_offset"] difference = expected - size assert difference >= 0, ( f"{difference} ({struct_name}.{field_name}) current={size} " f"!= expected={expected}" ) # Add padding automatically. if difference > 0: for padding_field in padding.add_padding(difference): # Padding should never generate more padding. assert not list( process_field( struct_name, padding, types, padding_field, namespace ) ) # The caller is responsible for updating the container for # fields. yield padding_field types.add( struct_name, field_name, type_string(field["type"]), array_length=field.get("array_length"), exact=False, default=field.get("array_length"), )