"""CDR format adapters. Each adapter parses a switch-specific CDR file format into a normalized ``CDRRow`` stream consumed by the ingester. Selection is driven by the ``cdr_ingestion_profiles.format`` column (or inferred from a switch preset). Contract: ``BaseCDRAdapter.iter_rows(path_or_bytes) -> Iterator[CDRRow]`` plus ``Adapter.FORMAT_SLUG`` and required-column metadata used by the validator. """ from .base import BaseCDRAdapter, CDRRow, ValidationError from .generic_csv import GenericCSVAdapter from .asterisk import AsteriskAdapter from .freeswitch import FreeSWITCHAdapter from .netsapiens import NetSapiensAdapter ADAPTERS: dict[str, type[BaseCDRAdapter]] = { "generic_csv": GenericCSVAdapter, "asterisk": AsteriskAdapter, "freeswitch": FreeSWITCHAdapter, "netsapiens": NetSapiensAdapter, } __all__ = [ "ADAPTERS", "BaseCDRAdapter", "CDRRow", "ValidationError", "GenericCSVAdapter", "AsteriskAdapter", "FreeSWITCHAdapter", "NetSapiensAdapter", ]