///|
/// The `.proto` front end → moonrpc. `parse_proto` reads a proto3 file — messages
/// (with `repeated`, `map`, `oneof`, and `reserved`), enums, and a service
/// whose RPCs may be client/server `stream`ing — and `generate_grpc` emits for
/// moonrpc a struct per message with `encode` and `decode`, a `@moonrpc.Method` per
/// RPC, and per service a record of handlers whose `handlers()` is ready for
/// `GrpcServer`. `proto_reserved_conflicts` surfaces a field that illegally reuses a
/// `reserved` number or name.
///
///     moon run src/examples/03-proto-grpc
#coverage.skip
fn main {
  let source =
    #|syntax = "proto3";
    #|package shop;
    #|
    #|// order lifecycle
    #|enum Status {
    #|  UNKNOWN = 0;
    #|  PAID    = 1;
    #|  SHIPPED = 2;
    #|}
    #|
    #|message Item {
    #|  string sku = 1;
    #|  int64  qty = 2;
    #|}
    #|
    #|message Order {
    #|  reserved 3, 4;
    #|  reserved "legacy_note";
    #|  string              id     = 1;
    #|  repeated Item       items  = 2;
    #|  map labels = 5;
    #|  Status              status = 6;
    #|  string              legacy_note = 9;
    #|  oneof contact {
    #|    string email = 7;
    #|    string phone = 8;
    #|  }
    #|}
    #|
    #|message Ack { bool ok = 1; }
    #|
    #|service Orders {
    #|  rpc Create (Order)        returns (Ack);
    #|  rpc Watch  (Order)        returns (stream Order);
    #|  rpc Upload (stream Item)  returns (Ack);
    #|}
  let proto = @moonctl.parse_proto(source)
  println(
    "package \{proto.package_}: \{proto.messages.length()} messages, \{proto.enums.length()} enums, \{proto.services.length()} services",
  )
  for m in proto.messages {
    let conflicts = @moonctl.proto_reserved_conflicts(m)
    if conflicts.length() > 0 {
      println("  reserved conflict in \{m.name}: \{conflicts.join(", ")}")
    }
  }
  println(
    "\n==== generate_grpc(parse_proto(src)) -> moonrpc messages and handlers ====\n",
  )
  println(@moonctl.generate_grpc(proto))
}