fix: align interface macros with canonical values
This commit is contained in:
@@ -30,8 +30,9 @@ wip-public-api-example (workspace-only executable, integration tests, doctest)
|
||||
The boundary is intentional: protocol types describe what can cross a
|
||||
transport; application DTOs opt into that model with `WipType`; a host-private
|
||||
implementation owns credentials, handles, and backend state; and a future
|
||||
transport maps its own routes/envelopes to `OperationCall`/`OperationResult`
|
||||
without placing transport-specific types in descriptors or application traits.
|
||||
transport maps its own routes/envelopes to `CallOperationRequest` and
|
||||
`CallOperationResponse` without placing transport-specific types in descriptors
|
||||
or application traits.
|
||||
|
||||
## End-to-end example
|
||||
|
||||
@@ -104,12 +105,13 @@ A supported interface is a public, non-generic trait containing methods with:
|
||||
- `()` only as the application return when no value is produced; and
|
||||
- direct `Option<T>` only for an omittable parameter.
|
||||
|
||||
`WipType` derives support named-field structs, all-unit enums, and enums whose
|
||||
variants each contain exactly one unnamed payload. The macros reject private,
|
||||
`WipType` derives support named-field structs, all-unit enums, and unions whose
|
||||
cases may be unit variants or variants containing exactly one unnamed payload.
|
||||
The macros reject private,
|
||||
generic, inherited, unsafe, auto, or associated-item traits; const, async,
|
||||
unsafe, extern, variadic, generic, default-bodied, or non-`&self` methods;
|
||||
borrowed/custom-lifetime values; tuple/unit/generic structs; Rust unions;
|
||||
mixed/named-field enum variants; explicit discriminants; nested `Option`; and
|
||||
named-field/multi-field enum variants; explicit discriminants; nested `Option`; and
|
||||
`Option` in returns, collections, entries, or union payloads. These diagnostics
|
||||
are compile-fail tested under `crates/wip-interface/tests/ui`.
|
||||
|
||||
@@ -117,23 +119,36 @@ are compile-fail tested under `crates/wip-interface/tests/ui`.
|
||||
|
||||
| Rust | Protocol |
|
||||
| --- | --- |
|
||||
| `()` as an operation result | no returned value |
|
||||
| `()` | unit / `Value::Unit` |
|
||||
| `bool` | boolean |
|
||||
| integer primitives | JavaScript-lossless integer |
|
||||
| `f32`, `f64` | finite number |
|
||||
| `String` | string |
|
||||
| `wip::Bytes` | bytes |
|
||||
| `wip::JsonValue` | JSON |
|
||||
| `wip::Entry<K, V>` | entry |
|
||||
| `wip::JsonValue` | JSON interpreted over the schema-neutral `Value` tree |
|
||||
| `wip::Entry` | canonical absolute Worldspace path encoded as a string |
|
||||
| `Vec<T>` | list |
|
||||
| named-field `#[derive(wip::WipType)]` struct | named record |
|
||||
| all-unit `#[derive(wip::WipType)]` enum | named enum |
|
||||
| all-newtype `#[derive(wip::WipType)]` enum | named tagged union |
|
||||
| all-unit `#[derive(wip::WipType)]` enum | named enum encoded as a string |
|
||||
| mixed unit/newtype or all-newtype enum | named union encoded as a discriminator record |
|
||||
|
||||
`Option<T>` means that a direct DTO field or operation parameter may be
|
||||
omitted; it is not protocol null. JSON null remains available inside
|
||||
`wip::JsonValue`.
|
||||
|
||||
#### Migration from the pre-canonical value API
|
||||
|
||||
The old generic `wip::Entry<K, V>` represented an application key/value pair
|
||||
and is no longer available. Use `wip::Entry::new("/canonical/path")` for a
|
||||
Worldspace entry path and place any associated application data in a record.
|
||||
`Entry` encodes as `Value::String` and validates the canonical absolute path.
|
||||
|
||||
The semantic `Value::Json`, `Value::Entry`, `Value::Enum`, and `Value::Union`
|
||||
variants have also been removed. JSON recursively uses `Unit`, primitive,
|
||||
`List`, and `Record` values and rejects `Bytes`; enums use `String`; unions use
|
||||
a `Record` containing `$case` and, for payload-bearing cases, `value`. Unit
|
||||
operation results are represented explicitly as `Value::Unit`.
|
||||
|
||||
Rust doc comments become descriptor metadata. For an operation, a `# Returns`
|
||||
section documents the return declaration; text before that section documents
|
||||
the operation itself.
|
||||
@@ -155,8 +170,9 @@ let protocol_object = published.protocol_object();
|
||||
`expose` compiles only when the object implements the generated definition's
|
||||
interface trait. Implementing a trait does not expose it automatically, empty
|
||||
interface sets are valid, insertion order is preserved, and duplicate
|
||||
references are rejected. Registry references are opaque; descriptor names and
|
||||
Rust type names are not used as independent wire identity.
|
||||
references are rejected. Registry references are opaque and remain outside the
|
||||
descriptor; generated descriptors contain neither those references nor Rust
|
||||
trait identity.
|
||||
|
||||
Dispatch is qualified by interface reference and operation name. The host
|
||||
checks current object identity and validator policy, current interface
|
||||
|
||||
Reference in New Issue
Block a user