decl-lang
Decl is a declarative language for describing, generating, and validating structured data — a JSON superset with a strong static type system, constraints with first-class diagnostics, references, physical quantities, generics, and modules. Pure, deterministic, terminating.
This crate is the native Rust implementation of the whole language:
the tree-sitter grammar is compiled in, decl checks, evaluates,
validates, and formats modules (packages included), and decl-lsp is
the language server — no Node.js or wasm involved.
Command line
Diagnostics go to stderr as file: severity [code] id at path: message,
or into the JSON report with --json. The exit code is 1 when any error
was reported.
Library
use ;
let docs = evaluate?; // exported outputs, by name, as canonical JSON text
let site = &evaluate?;
let done = evaluate?;
let problems = check; // empty when clean
let report = validate?;
let text = format_source?; // "const x = 1 + 2\n"
The functions are the decl command line in its own vocabulary:
inputs binds documents by input name (a JSON file, or JSON text),
outputs names the roots to return — outputs, or inputs bound here or
demanded through their fallback — and defaults to the entry module's
exported outputs; a failure is a DeclError whose diagnostics carry
the report. The npm package (evaluate, …) and the PyPI package
(decl.evaluate, …) offer the same functions with the same semantics;
the modules the functions are built from are public as well.
Scope
The crate covers the whole language: parsing, the static checks of
chapters 3–4 (type resolution with generics and dimension algebra,
inference, assignability, the absence discipline, match
exhaustiveness), binding with lazy slots and cycle detection,
$referrers, assertions with diagnostic templates, canonical
serialization, modules and packages (decl.toml, decl.lock), the
canonical formatter, and the language server. Its output is
byte-identical to the reference implementation — the repository's
parity harness (tests/parity/differential.py, run by make verify)
diffs the Rust and Python runtimes against the reference over every
example and fixture that produces output.
Building from source
The grammar's C sources are compiled by build.rs. Inside the
repository they come from ../tree-sitter-decl/src; the published crate
carries a copy under grammar/ (generated by npm run build in
decl-ts/).
License
MIT — see LICENSE.