Skip to content

zio-blocks-rpc: RPC type class for service trait introspection (derives RPC) #1143

Description

@987Nabil

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions