"""Data models for PinMAP → PinList conversion.""" from dataclasses import dataclass, field @dataclass class Pin: """A single pin on the package.""" number: int name: str edge: str # "top" | "right" | "bottom" | "left" position_on_edge: int @dataclass class PinMAP: """Parsed pin map from an Excel file.""" package_info: str pins: list[Pin] width: int height: int grid_origin: tuple[int, int] # (row, col) of top-left corner raw_cells: dict[tuple[int, int], str] = field(default_factory=dict) @dataclass class PinList: """Flat pin list for output.""" package_info: str rows: list[tuple[str, int]] # [(PinName, Pin序号), ...] @dataclass class ValidationError: """A single validation issue.""" level: str # "error" | "warning" message: str details: str @dataclass class ValidationResult: """Aggregate validation result.""" is_valid: bool errors: list[ValidationError] = field(default_factory=list) warnings: list[ValidationError] = field(default_factory=list) # ── Custom exceptions ────────────────────────────────────────────── class PinMapError(Exception): """Base exception for this project.""" class FileFormatError(PinMapError): """Raised when a file is not a valid Excel format.""" class StructureError(PinMapError): """Raised when the PinMAP structure is invalid or unrecognisable."""