code: private RpcElement readRpc(Location location, String documentation) {
      String name = reader.readName();
  
      reader.require('(');
  
      boolean requestStreaming = false;
      String requestType;
      String word = reader.readWord();
      if (word.equals("stream")) {
        requestStreaming = true;
        requestType = reader.readDataType();
      } else {
        requestType = reader.readDataType(word);
      }
      reader.require(')');
  
      if (!reader.readWord().equals("returns")) throw reader.unexpected("expected 'returns'");
  
      reader.require('(');
  
      boolean responseStreaming = false;
      String responseType;
      word = reader.readWord();
      if (word.equals("stream")) {
        responseStreaming = true;
        responseType = reader.readDataType();
      } else {
        responseType = reader.readDataType(word);
      }
      reader.require(')');
  
      ImmutableList.Builder<OptionElement> options = ImmutableList.builder();
      if (reader.peekChar('{')) {
        while (true) {
          String rpcDocumentation = reader.readDocumentation();
          if (reader.peekChar('}')) {
            break;
          }
          Object declared = readDeclaration(rpcDocumentation, Context.RPC);
          if (declared instanceof OptionElement) {
            options.add((OptionElement) declared);
          }
        }
      } else {
        reader.require(';');
      }
  
      return new RpcElement(
          location,
          name,
          documentation,
          requestType,
          responseType,
          requestStreaming,
          responseStreaming,
          options.build()
      );
    }
docs: Reads an rpc and returns it.