The shared ingest engine for airledger.
A pure-Rust port of the business logic currently living in
airledger/lib/models/ + airledger/lib/services/ (Dart):
- Schema parsing for paired
.view.yml+.input.ymlfiles - Type-aware validation, show-when predicates, derives
- Template interpolation (Jinja-equivalent)
- Sheets ingest (gsheets write path)
Same playbook as airlayer: one Rust crate, three build outputs.
| Target | Build | Binding |
|---|---|---|
| Mobile (Flutter) | static / dynamic lib | dart:ffi |
| Web (Oxy bundle) | WASM (wasm-bindgen) |
@oxy-hq/sdk consumer |
| Backend | native bin / lib | direct |
- ✅ Phase 1 — schema model + paired
.view.yml/.input.ymlparser. - ✅ Phase 2 — evaluator: show_when predicates, derives, codec, minijinja templates.
- ✅ Phase 3 — sheets ingest: RS256 JWT auth + ensure / list / create / update / delete.
- ✅ Phase 4a — Dart FFI binding, host build (
sdk-dart/). - ✅ Phase 4b — Android / iOS build scripts (
sdk-dart/scripts/). - ⏳ Phase 5 — WASM binding for Oxy customer-app bundles.
See docs/port-plan.md for the full plan,
architectural decisions, and how to continue mid-stream.
cargo test # 18 Rust tests (sheets round-trip is env-gated)
cd sdk-dart && dart test # 6 Dart FFI tests (rebuilds dylib if needed)Run the live-workbook sheets round-trip:
AIRLEDGER_SHEETS_TEST_CREDS_PATH=/path/to/sa.json \
AIRLEDGER_SHEETS_TEST_SPREADSHEET_ID=1abc...xyz \
cargo test --test sheets_integration -- --nocapture