Skip to main content

frazaro_core/
lib.rs

1//! frazaro-core: the host-free home of the Frazaro language's bridges.
2//!
3//! The contract (docs/HORIZON.md, section 12): bytes in, bytes out, nothing
4//! else. No clock, no randomness, no threads, no file system, no socket. On
5//! the wasm32 target the built module's import section is empty, and
6//! tools/check_core_imports.ps1 pins that count at zero.
7//!
8//! Since PORT.12 (2026-10-08) the language itself is a crate of its own,
9//! `vla-lang`, this crate's one dependency: the reader, the forms and their
10//! printing, macro expansion, the head table, the intrinsics, the message
11//! catalogue's mechanism with the language's own refusals, the version
12//! predicates, the grid, the references read out of a formula's text, the
13//! relation rows and the view record. Those modules are re-exported here
14//! whole, below, so every path a door used before the cut resolves as it
15//! did. What this crate holds is the bridges: the English engine
16//! (`english`), the VBA and formula emitters (`emit`), the workbook writer
17//! (`build` over `sheet`'s formats) and the readers (`reflect`), the formula
18//! sink's scan (`egress`), the distro manifest (`distro`), the kernel's
19//! registries (`kernel`), the core's half of the catalogue (`messages`), the
20//! API (`api`) and the C surface (`abi`). The three-crate order is
21//! Alonzo/CHARTER.md section 4, rule 1: an engine consumes `vla-lang` and
22//! never this crate.
23//!
24//! SD-18 governs what this crate may claim: the VBA in src/ is the reference
25//! implementation, and this crate follows the goldens in scripts/ and never
26//! leads them. conformance/README.md is the treaty; tools/prove.ps1 scores an
27//! implementation against it.
28//!
29//! The API a door calls is VLA_Browser.bas's pair, text in and text out:
30//! `api::english_translate_text_to_vla` and `api::english_translate_text_to_vba`
31//! (PORT.6, slice 6g), and `abi` exports the pair with C linkage for a wasm
32//! host or a native embedding (6h): an allocator pair, the two functions, the
33//! door's gate and the version, every answer one record in the module's
34//! memory. The version and the ABI number were exported from the first
35//! commit, so that CI held the zero-import property before anything else
36//! existed.
37//!
38//! The writer (PORT.7) is `build` over `sheet`: a translated program to a
39//! workbook's bytes, deterministic, with no clock and no dependency outside
40//! the repository; `api::english_build_xlsx` is its surface.
41//!
42//! The reader (PORT.8) is `reflect`: a workbook's bytes, OOXML first, read
43//! as the relations of `REFLECT` with no host, streamed sheet by sheet;
44//! `api::reflect_relations` is its surface. `refers` (slice 8b, the
45//! language's since the cut) is the formula-reference reader,
46//! `VLA_Refers.bas` ported and held to its golden: the `refers` rows, the
47//! writer's mover and the R1C1 rendering all come off its one scan.
48//!
49//! `egress` (SEC.15) is the formula sink's scan, `VlaFormulaEgress` of
50//! `VLA_Runtime.bas` held to the egress golden: the writer asks it before
51//! it writes a formula, as the add-in's two backends do, and refuses one
52//! that reaches outside the workbook on its own.
53//!
54//! `kernel` (KERNEL.1) writes the kernel's boundary and its six seams down
55//! as data and names the engines trait; the projections seam's trait is the
56//! language's (`vla_lang::projection`) and is re-exported there. `view`
57//! (KERNEL.4, the language's) is the first implementation of that seam: one
58//! window of the sheet model as the view record, a pure function of the
59//! program and the books, the lines a viewport draws from;
60//! `api::english_view` is its surface. `distro` (KERNEL.2) reads a distro's
61//! manifest, the folder the build tools take: the prelude, the phrasebooks
62//! in their load order, the dialects, the libraries and an edition's chrome,
63//! by reference; the command-line door proves a distro whole with it.
64
65pub mod abi;
66pub mod api;
67pub mod build;
68pub mod distro;
69pub mod egress;
70pub mod emit;
71pub mod english;
72pub mod excel;
73pub mod kernel;
74pub mod messages;
75pub mod reflect;
76pub mod sha256;
77pub mod sheet;
78
79// The language, re-exported whole (PORT.12): `frazaro_core::form`,
80// `crate::view::Grid` and every other path a door or a test used before
81// the cut resolve as they did. The modules are vla-lang's, documented there.
82pub use vla_lang::{calc, expand, form, headtable, intrinsics, printer, reader, refers, view};
83
84/// The version predicates (`parse`, `compare`, `at_least`), the language's,
85/// re-exported as the module they were; the function `version` below is
86/// the core's own.
87pub mod version {
88    pub use vla_lang::version::*;
89}
90
91/// The crate's version, which tools/check_version_twin.ps1 holds equal to
92/// VLA_RELEASE_VERSION in src/VLA.bas and to the language crate's: one
93/// corpus, one version.
94pub const VERSION: &str = env!("CARGO_PKG_VERSION");
95
96/// The number a door checks before calling anything else. It changes only
97/// when an exported signature changes its meaning.
98pub const ABI_VERSION: u32 = 1;
99
100/// The version as text.
101pub fn version() -> &'static str {
102    VERSION
103}
104
105/// The ABI number, exported with C linkage so that a wasm host or a native
106/// embedding can read it without any binding layer.
107#[no_mangle]
108pub extern "C" fn frazaro_abi_version() -> u32 {
109    ABI_VERSION
110}
111
112#[cfg(test)]
113mod tests {
114    use super::*;
115
116    #[test]
117    fn version_is_major_minor_patch() {
118        let parts: Vec<&str> = version().split('.').collect();
119        assert_eq!(parts.len(), 3, "SD-14 numbers releases MAJOR.MINOR.PATCH");
120        for part in parts {
121            assert!(
122                part.parse::<u32>().is_ok(),
123                "non-numeric version part: {part}"
124            );
125        }
126    }
127
128    #[test]
129    fn abi_version_is_one() {
130        assert_eq!(frazaro_abi_version(), 1);
131        assert_eq!(ABI_VERSION, 1);
132    }
133
134    #[test]
135    fn the_language_and_the_core_are_one_version() {
136        assert_eq!(vla_lang::VERSION, VERSION, "one corpus, one version");
137    }
138}