// Copyright 2016 The LUCI Authors. All rights reserved.
// Use of this source code is governed under the Apache License, Version 2.0
// that can be found in the LICENSE file.

syntax = "proto3";

package prpc;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

service Calc {
  rpc Multiply (MultiplyRequest) returns (MultiplyResponse) {}
}

message MultiplyRequest {
  int32 x = 1;
  int32 y = 2;
}

message MultiplyResponse {
  int32 z = 1;
}