Add typed Decodal derive support

This commit is contained in:
2026-06-26 00:39:33 +09:00
parent 87fef44c68
commit b8404df047
21 changed files with 729 additions and 11 deletions
+42 -1
View File
@@ -17,7 +17,7 @@ let / function env
```
Module top-level bindings shadow prelude bindings.
Primitive type names such as `String`, `Int`, `Float`, and `Bool` are handled before environment lookup, so they are reserved and cannot be shadowed by host bindings.
Primitive type names such as `String`, `Int`, `Float`, `Bool`, and `Array` are handled before environment lookup, so they are reserved and cannot be shadowed by host bindings.
## Global bindings
@@ -87,6 +87,47 @@ Concrete(Object {
This matches the runtime model used for Decodal source-defined schema objects.
## Typed Rust integration
Hosts can use `decodal-derive` to keep a Rust struct, the Decodal schema, and the decoded result in sync.
The derive implements two traits from the `decodal` crate:
- `DecodalSchema`: builds a `HostValue` schema that can be passed to `Engine::bind_global`.
- `DecodalDecode`: decodes materialized `Data` back into the Rust type.
```rust
use decodal::{DecodalDecode, DecodalSchema, EmptyLoader, Engine};
use decodal_derive::Decodal;
#[derive(Decodal)]
struct Service {
name: String,
#[decodal(gt = 443, default = 8443)]
port: i64,
#[decodal(rename = "feature.enable", default = true)]
feature_enabled: bool,
}
let mut engine = Engine::new(EmptyLoader);
engine.bind_global("Service", Service::decodal_schema())?;
let value = engine.eval_module(module)?;
let data = engine.materialize(&value)?;
let service = Service::decodal_decode(&data)?;
```
Supported field attributes are intentionally small:
- `rename = "path.to.field"`
- `default`
- `default = value`
- numeric constraints: `gt`, `gte`, `lt`, `lte`
The derive does not add host callbacks or reflection.
It only generates schema construction and typed decoding code.
## SourceLoader and prelude together
`SourceLoader` and host prelude bindings are independent mechanisms.
+3
View File
@@ -23,11 +23,13 @@ cargo run -q -p decodal-cli --features regex -- examples/regex/main.dcdl
## crates.io release
The primary crates.io package is `decodal`, which contains the embeddable library.
`decodal-derive` provides optional derive macros for Rust struct integration.
Workspace support crates such as `decodal-cli` and `decodal-wasm` are not published for 0.1.0.
The project is dual licensed as `MIT OR Apache-2.0`.
```sh
cargo publish -p decodal
cargo publish -p decodal-derive
```
Before publishing, run:
@@ -37,6 +39,7 @@ cargo fmt --check
cargo test
cargo check -p decodal --no-default-features
cargo publish -p decodal --dry-run
cargo publish -p decodal-derive --dry-run
```
## Web site and playground
+2 -1
View File
@@ -9,9 +9,10 @@ name = String;
retry = Int default 3;
ratio = Float;
enable = Bool default true;
tags = Array;
```
現在の primitive type は `String``Int``Float``Bool` である。
現在の primitive type は `String``Int``Float``Bool``Array` である。
各型の個別仕様へのリンクは [Manual Index](../../index.md) に集約する。
primitive type と制約合成の詳細は [制約と default](../constraints-and-defaults.md) も参照する。