Summary
Add a zio-blocks-rpc module providing a derives RPC type class that captures service trait structure as a "pure data" representation — analogous to how derives Schema works for data types.
Design Direction (per @jdegoes)
trait MyService { ... } derives RPC
Then derive gRPC, JSON RPC, etc. from the "pure data" representation. ZIO Schema is used for input/output types.
Key Design Decisions
- Module:
zio-blocks-rpc / package zio.blocks.rpc
- Type class:
RPC[T] — runtime data structure capturing service operations (names, schemas, annotations, errors)
- Schema integration: Macro auto-summons
Schema for all I/O types during derivation
- ZIO effect unwrapping: Methods must return
ZIO[R, E, A] — macro extracts output type A and error type E
- Protocol derivation:
RpcDeriver[Protocol[_]] trait (analogous to Schema's Deriver[TC[_]])
- Reference protocol: JSON-RPC 2.0 included as proof-of-concept
- Annotations:
MetaAnnotation and ErrorAnnotation[E] for service/method-level metadata
- Scala version: Scala 3 only
- Platforms: JVM + JS (crossProject)
Inspiration
- bishabosha/ops-mirror (Apache-2.0) — compile-time trait method introspection
- ZIO Blocks Schema codec derivation pattern (Format/Deriver/Schema)
Summary
Add a
zio-blocks-rpcmodule providing aderives RPCtype class that captures service trait structure as a "pure data" representation — analogous to howderives Schemaworks for data types.Design Direction (per @jdegoes)
Then derive gRPC, JSON RPC, etc. from the "pure data" representation. ZIO Schema is used for input/output types.
Key Design Decisions
zio-blocks-rpc/ packagezio.blocks.rpcRPC[T]— runtime data structure capturing service operations (names, schemas, annotations, errors)Schemafor all I/O types during derivationZIO[R, E, A]— macro extracts output typeAand error typeERpcDeriver[Protocol[_]]trait (analogous to Schema'sDeriver[TC[_]])MetaAnnotationandErrorAnnotation[E]for service/method-level metadataInspiration