//! Contract parsing, resolution, and rendering.
//!
//! Three front-ends (inline attributes, embedded JSON, and `pred!`-style
//! compound-property macros, plus the pest DSL for expressions) all funnel into
//! `Property::parse_list`, producing a single IR defined in [`types`].
//!
//! ## Layering
//!
//! Contracts go through two stages, each with its own type:
//!
//! ```text
//! #[rapx::requires(...)] text std-*.json pred!(...) / def_property
//! └─ attr.rs ──▶ AttrProperty └─ json.rs ──▶ JsonProperty └─ compound.rs ──▶ CompoundSpec
//! └────────────────── builder.rs ──────────────────▶ Property (Atom | Or)
//! ```
//!
//! Within the resolved IR, the naming follows granularity rather than stage:
//! `Property*` names the formula level (`Property`, `PropertyKind`,
//! `PropertyArg`), while `Contract*` names the expression sub-language that
//! fills `PropertyArg::Expr` (`ContractPlace`, `ContractExpr`,
//! `ContractProjection`).
pub
pub
pub
pub
pub
pub
pub
pub
pub
pub
pub
pub use *;