//! Mizan server-side IR substrate. Rust analog of `cores/mizan-python/src/mizan_core/`.
//!
//! Three load-bearing concerns:
//!
//! 1. **IR data model + KDL emitter.** `build_ir()` produces byte-equivalent
//!    KDL to the Python emitter. Both backends emit the same contract.
//! 2. **Compile-time registry.** Proc macros from `mizan-macros` populate
//!    linkme distributed slices (`TYPES`, `CONTEXTS`, `FUNCTIONS`) at the
//!    consumer crate's expansion sites.
//! 3. **Runtime helpers.** `compute_invalidation` / `compute_merges` /
//!    `lookup_function` ported from `mizan-fastapi`'s executor; the HTTP
//!    adapter calls these per request.
//!
//! Consumers `use mizan_core::prelude::*;` and alias the crate as `mizan` at
//! their call sites so authored code reads `#[mizan::context]` / `#[mizan(...)]`.

pub mod graph_check;
pub mod ir;
pub mod kdl;
pub mod registry;
pub mod runtime;
pub mod traits;

pub use ir::{
    AffectTarget, DefaultValue, NamedType, Primitive, StructField, Transport, TypeShape,
};
pub use kdl::{build_ir, snake_to_camel};
pub use registry::{
    context_members, lookup_context, lookup_function, ContextEntry, TypeEntry, CONTEXTS,
    FUNCTIONS, TYPES,
};
pub use runtime::{
    compute_invalidation, compute_merges, InvalidationTarget, MergeEntry, MizanError,
    RequestHandle,
};
pub use traits::{ContextMarker, FunctionSpec, InputParam, MizanType};

// Re-export proc macros so consumers depend on one crate.
pub use mizan_macros::{client, context, Mizan};

pub mod prelude {
    pub use crate::ir::{
        AffectTarget, DefaultValue, NamedType, Primitive, StructField, Transport, TypeShape,
    };
    pub use crate::registry::{ContextEntry, TypeEntry};
    pub use crate::runtime::{MizanError, RequestHandle};
    pub use crate::traits::{ContextMarker, FunctionSpec, InputParam, MizanType};
    pub use mizan_macros::Mizan;
}

/// Internal re-exports used by `mizan-macros`-generated code. Not part of
/// the public API — consumers must not depend on names under `__priv`.
#[doc(hidden)]
pub mod __priv {
    pub use linkme;
    pub use serde_json;
}
