id_effect 0.3.0

Effect<A, E, R> (sync + async), capability DI, pipe — interpreter-style, no bundled executor
Documentation
# API boundaries

[`id_effect_rpc`](../../../id_effect_rpc) implements Phase D RPC-shaped HTTP boundaries: correlation ids, JSON error envelopes, OpenAPI emission, codegen stubs, API versioning, and tracing helpers.

## Correlation and errors

Use [`ensure_correlation_id`](https://docs.rs/id_effect_rpc/latest/id_effect_rpc/correlation/fn.ensure_correlation_id.html) and [`RpcError`](https://docs.rs/id_effect_rpc/latest/id_effect_rpc/struct.RpcError.html) for consistent wire errors. Validate bodies with `id_effect_axum::json::decode_json_schema`.

## OpenAPI and codegen

- [`openapi::emit_openapi_json`]https://docs.rs/id_effect_rpc/latest/id_effect_rpc/openapi/index.html — route metadata → OpenAPI 3
- [`codegen::emit_service_trait`]https://docs.rs/id_effect_rpc/latest/id_effect_rpc/codegen/index.html — D3 trait stub generation

## API versioning

[`versioning::negotiate_api_version`](https://docs.rs/id_effect_rpc/latest/id_effect_rpc/versioning/fn.negotiate_api_version.html) resolves version from `Accept-Version` or `/vN/` path prefix:

```rust
use id_effect_rpc::versioning::{ApiVersion, VersionConfig, negotiate_api_version};

let cfg = VersionConfig::new(ApiVersion::new("v1"), vec![ApiVersion::new("v1")]);
let app = router.layer(axum::middleware::from_fn_with_state(cfg, negotiate_api_version));
```

## RPC tracing example

```bash
cargo run -p id_effect_rpc --example 020_rpc_tracing
```

Spans use stable field names consumable by `id_effect_opentelemetry` layers.

## See also

- Part II: [RPC boundaries]../part2/ch07-12-rpc-boundaries.md
- Mission: `platform-api-boundaries`