# Import contracts: the core layering, the msgspec boundary, and no imports of generated packages.
# (A `forbidden` contract errors on a missing source module, so per-module rules are expressed
# as layers or anchored on the root package.)

[importlinter]
root_package = ocsf_toolkit
include_external_packages = True

# ir <- loader/export <- schema <- walk <- derive/conform/observables <- engine <- models,
# with codegen and diff beside walk: they may use schema and below, nothing above, not each other.
# cli is the outermost layer; nothing in core imports it.
[importlinter:contract:layers]
name = Core layering (codegen and diff depend on schema only)
type = layers
containers = ocsf_toolkit
layers =
    cli
    models
    engine
    derive | conform | observables
    walk | codegen | diff
    schema
    loader | export
    ir

# Architecture rule 2 also allows codegen to import msgspec; it has no need to, so this is stricter.
[importlinter:contract:msgspec-boundary]
name = Only models imports msgspec
type = forbidden
source_modules =
    ocsf_toolkit
forbidden_modules =
    msgspec
allow_indirect_imports = True
ignore_imports =
    ocsf_toolkit.models -> msgspec

[importlinter:contract:no-generated-packages]
name = Nothing in ocsf_toolkit imports a generated version package (ocsf_toolkit_v*)
type = forbidden
source_modules =
    ocsf_toolkit
forbidden_modules =
    ocsf_toolkit_v1_7_0
    ocsf_toolkit_v1_8_0
    ocsf_toolkit_v1_9_0
