// Generated by moonrpc from service.mbt. Edit those files, not this one.

///|
pub fn[R :  @moonrpc.Registrar] Greeter::register(self : Greeter, server : R) -> Unit {
  server.register_handler(
    "/greet.Greeter/SayHello",
    @moonrpc.unary((_ctx, req : HelloRequest) => Greeter::say_hello(self, req)),
  )
}

///|
pub struct GreeterClient[C] {
  channel : C
}

///|
pub fn[C] GreeterClient::new(channel : C) -> GreeterClient[C] {
  { channel, }
}

///|
pub async fn[C :  @moonrpc.Caller] GreeterClient::say_hello(
  self : GreeterClient[C],
  req : HelloRequest,
  metadata? : Array[@moonrpc.Header],
  timeout_millis? : Int32,
  retry? : @moonrpc.Retry,
) -> HelloReply {
  self
    .channel
    .invoke(
      "/greet.Greeter/SayHello",
      [@moonrpc.Message::encode(req)],
      metadata.unwrap_or([]),
      timeout_millis,
      retry,
    )
    .reply()
}

///|
pub fn descriptor() -> @moonrpc.FileDescriptor {
  @moonrpc.FileDescriptor::new(
    "service.proto",
    "greet",
    messages=[
      @moonrpc.MessageDescriptor::new(
        "HelloRequest", [@moonrpc.FieldDescriptor::new("name", 1, TypeString)]
      ),
      @moonrpc.MessageDescriptor::new(
        "HelloReply", [@moonrpc.FieldDescriptor::new("message", 1, TypeString)]
      ),
    ],
    services=[
      {
        name: "Greeter",
        methods: [
          {
            name: "SayHello",
            input_type: ".greet.HelloRequest",
            output_type: ".greet.HelloReply",
            client_streaming: false,
            server_streaming: false,
          },
        ],
      },
    ],
  )
}

///|
pub impl @moonrpc.Message for HelloRequest with fn encode(self) {
  let w = @moonrpc.PbWriter::new()
  if self.name != "" {
    w.string_(1, self.name)
  }
  w.to_bytes()
}

///|
pub impl @moonrpc.Message for HelloRequest with fn decode(b) {
  let r = @moonrpc.PbReader::new(b)
  let v_name :Ref[String] = Ref("")
  while !r.eof() {
    match r.read_tag() {
      (1, LengthDelim) => v_name.val = r.read_string()
      (_, wire) => r.skip(wire)
    }
  }
  HelloRequest::{ name: v_name.val }
}

///|
pub impl @moonrpc.Message for HelloReply with fn encode(self) {
  let w = @moonrpc.PbWriter::new()
  if self.message != "" {
    w.string_(1, self.message)
  }
  w.to_bytes()
}

///|
pub impl @moonrpc.Message for HelloReply with fn decode(b) {
  let r = @moonrpc.PbReader::new(b)
  let v_message :Ref[String] = Ref("")
  while !r.eof() {
    match r.read_tag() {
      (1, LengthDelim) => v_message.val = r.read_string()
      (_, wire) => r.skip(wire)
    }
  }
  HelloReply::{ message: v_message.val }
}