Draft builder API (ADR-009) and generalized validation validate_bytes (ADR-010) for v0.1.0
- ADR-009: fluent Rust builder producing serde_json::Value, covers AlkType kinds + standard JSON Schema; resolves OQ-003 (alkcall is the unblocking consumer) - ADR-010: AlkTypeEngine::validate_bytes(&[u8]) as the single-call binary-buffer validation entry point; materialize Value from bytes, then validate; two methods on one struct, not a trait - builder.md: full builder API spec (Schema, Definitions, Discriminator) with four usage examples (channels chunk header, call input schema, SFTP Packet union, OperationSpec error schemas) - validation.md: new validate_bytes subsection + entry-point comparison table; AlkTypeEngine impl block updated; design decisions table updated - overview.md: builder.md added to component pointers; 'Not a schema builder' scope boundary retired; ADR-009/010 added to decisions table; OQ-003 marked resolved; Consumers table adds alkcall as first consumer - open-questions.md + questions/003: OQ-003 moved from deferred(scope) to resolved (ADR-009) - README.md: builder doc + ADR-009/010 added; OQ-003 marked resolved; two new Key Design Principles (9, 10) for v0.1.0 additions Doc-only change; 346 tests pass, clippy clean.
This commit is contained in:
1 parent
57d8ed25ba
commit
1a8a44ed0e
8 files changed
+1250
-39
No files matched your search
@@ -1,6 +1,6 @@
|
||||
---
|
||||
status: draft
|
||||
last_updated: 2026-07-22
|
||||
last_updated: 2026-08-11
|
||||
---
|
||||
|
||||
# alktype — Overview
|
||||
@@ -115,11 +115,20 @@ schema JSON determines the order of fields in the binary struct.
|
||||
|
||||
| Consumer | Schema describes | Engine provides |
|
||||
|----------|-----------------|-----------------|
|
||||
| **alkcall** (v0.1.0 first consumer) | channels' `ChunkHeader { channel_id: u32 BE, length: u32 BE }` + call's `OperationSpec.input_schema` / `output_schema` / `error_schemas` | `validate_bytes` for the 8-byte chunk header; `validate_json` for call's JSON payloads; builder API for both |
|
||||
| russh-sftp | 29 packet structs + Packet union (byte discriminator) | Read/write SFTP frames from bytes |
|
||||
| metatensor | Model layout (ConvNet struct, tensor refs) | Offset map for mmap'd tensor access |
|
||||
| binary call frames | `call.requested` / `call.responded` / etc. structs | Read/write binary call frames |
|
||||
| TTY negotiation | `NegotiateRequest` / `NegotiateResponse` structs | Read/write TTY control frames |
|
||||
| channels wire | `ChunkHeader { channel_id, length }` | Already trivial (8 bytes, no schema needed) |
|
||||
| channels wire | `ChunkHeader { channel_id, length }` | 8-byte chunk header (now in scope for alkcall; was "trivial" pre-v0.1.0) |
|
||||
|
||||
alkcall — the merged `alknet-call` (call protocol) + `alknet-channels`
|
||||
(channel multiplexing) extraction from `@alkdev/alknet` — is the
|
||||
consumer that bumped the builder API (OQ-003) and generalized
|
||||
validation (ADR-010) into v0.1.0. It uses alktype for two distinct
|
||||
schema roles (binary layout + JSON payloads) from one library. See
|
||||
[builder.md](builder.md) and [validation.md](validation.md)
|
||||
§"validate_bytes".
|
||||
|
||||
The russh-sftp case is the most instructive and the highest-value POC
|
||||
target. The `Packet` enum's `TryFrom<&mut Bytes>` impl is a hand-written
|
||||
@@ -142,10 +151,13 @@ These boundaries are decided in [ADR-001](decisions/001-alktype-purpose-scope-js
|
||||
later.
|
||||
- **Not a code generator.** typebox-rs's `codegen/` module is a separate
|
||||
concern. The alktype engine consumes schemas; it does not generate them.
|
||||
- **Not a schema builder.** The alktype engine does not provide a fluent
|
||||
API for constructing schemas. Schemas are plain JSON — authored in
|
||||
TypeBox, generated by ujsx components, or hand-written. A builder API
|
||||
is deferred (OQ-003).
|
||||
- **Schema builder is in scope as of v0.1.0.** A fluent Rust API for
|
||||
constructing schemas at runtime, producing `serde_json::Value`, is
|
||||
shipped in v0.1.0 ([ADR-009](decisions/009-builder-api.md), resolves
|
||||
OQ-003). The builder covers AlkType kinds and standard JSON Schema;
|
||||
see [builder.md](builder.md). Schemas may still be authored in
|
||||
TypeBox, generated by ujsx components, or hand-written — the builder
|
||||
is an additional construction path, not a replacement.
|
||||
- **Not a serialization framework.** The alktype engine is not a
|
||||
general-purpose serde replacement. It operates on raw byte buffers at
|
||||
computed offsets — no intermediate `Value` tree, no reflection, no
|
||||
@@ -166,6 +178,11 @@ These boundaries are decided in [ADR-001](decisions/001-alktype-purpose-scope-js
|
||||
- **[validation.md](validation.md)** — custom keyword validators for all
|
||||
19 `AlkType:*` kinds, `AlkTypeError`, load-time vs access-time
|
||||
validation, `AlkTypeEngine` as the compiled form of a schema.
|
||||
`validate_json` for JSON values; `validate_bytes` for binary buffers
|
||||
(ADR-010).
|
||||
- **[builder.md](builder.md)** — fluent Rust API for constructing
|
||||
alktype JSON Schemas at runtime, producing `serde_json::Value`.
|
||||
Covers AlkType kinds and standard JSON Schema (ADR-009).
|
||||
|
||||
## Design Decisions
|
||||
|
||||
@@ -179,6 +196,8 @@ These boundaries are decided in [ADR-001](decisions/001-alktype-purpose-scope-js
|
||||
| Non-final inline variable fields | [ADR-006](decisions/006-reject-non-final-inline-length-prefixed-in-aligned-mode.md) | Rejected in aligned mode (would clobber subsequent fields) |
|
||||
| Packed-mode read factory | [ADR-007](decisions/007-packed-mode-read-factory.md) | `engine.sequential_reader()` returns an owned fresh reader |
|
||||
| TUnion in aligned mode | [ADR-008](decisions/008-reject-tunion-in-aligned-mode.md) | Rejected for v1 (broken semantics; no current consumer needs it) |
|
||||
| Builder API | [ADR-009](decisions/009-builder-api.md) | Fluent Rust API producing `serde_json::Value`; covers AlkType kinds + standard JSON Schema; resolves OQ-003 |
|
||||
| Generalized validation — `validate_bytes` | [ADR-010](decisions/010-generalized-validation-validate-bytes.md) | Single-call binary-buffer validation on `AlkTypeEngine`; materialize `Value` from bytes, then validate |
|
||||
|
||||
## Open Questions
|
||||
|
||||
@@ -186,7 +205,9 @@ See [open-questions.md](open-questions.md) for full details.
|
||||
|
||||
- **OQ-001** (deferred(scope)): Arrays of variable-length-element structs.
|
||||
- **OQ-002** (deferred(scope)): `no_std` + `alloc` support.
|
||||
- **OQ-003** (deferred(scope)): Builder API for schema construction.
|
||||
- **OQ-003** (resolved by [ADR-009](decisions/009-builder-api.md)):
|
||||
Builder API for schema construction. Shipped in v0.1.0; see
|
||||
[builder.md](builder.md).
|
||||
|
||||
## References
|
||||
|
||||
|
||||
Reference in new issue
Block a user