// Path: src/main/java/com/squareup/protoparser/DataType.java
// final class NamedType implements DataType {
//   public static NamedType create(String name) {
//     return new NamedType(checkNotNull(name, "name"));
//   }
// 
//   private final String name;
// 
//   private NamedType(String name) {
//     this.name = name;
//   }
// 
//   public String name() {
//     return name;
//   }
// 
//   @Override public Kind kind() {
//     return Kind.NAMED;
//   }
// 
//   @Override public String toString() {
//     return name;
//   }
// 
//   @Override public boolean equals(Object obj) {
//     if (obj == this) return true;
//     if (!(obj instanceof NamedType)) return false;
//     NamedType other = (NamedType) obj;
//     return name.equals(other.name);
//   }
// 
//   @Override public int hashCode() {
//     return name.hashCode();
//   }
// }
// 
// Path: src/main/java/com/squareup/protoparser/Utils.java
// static void appendDocumentation(StringBuilder builder, String documentation) {
//   if (documentation.isEmpty()) {
//     return;
//   }
//   for (String line : documentation.split("\n")) {
//     builder.append("// ").append(line).append('\n');
//   }
// }
// 
// Path: src/main/java/com/squareup/protoparser/Utils.java
// static void appendIndented(StringBuilder builder, String value) {
//   for (String line : value.split("\n")) {
//     builder.append("  ").append(line).append('\n');
//   }
// }
// 
// Path: src/main/java/com/squareup/protoparser/Utils.java
// static <T> T checkNotNull(T value, String name) {
//   if (value == null) {
//     throw new NullPointerException(name + " == null");
//   }
//   return value;
// }
// 
// Path: src/main/java/com/squareup/protoparser/Utils.java
// static <T> List<T> immutableCopyOf(List<T> list) {
//   return unmodifiableList(new ArrayList<>(list));
// }


import com.google.auto.value.AutoValue;
import com.squareup.protoparser.DataType.NamedType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static com.squareup.protoparser.Utils.appendDocumentation;
import static com.squareup.protoparser.Utils.appendIndented;
import static com.squareup.protoparser.Utils.checkNotNull;
import static com.squareup.protoparser.Utils.immutableCopyOf;
// Copyright 2014 Square, Inc.
package com.squareup.protoparser;



@AutoValue
public abstract class RpcElement {
  public static Builder builder() {
    return new Builder();
  }

  RpcElement() {
  }

  public abstract String name();
  public abstract String documentation();
  public abstract NamedType requestType();
  public abstract NamedType responseType();
  public abstract List<OptionElement> options();

// Path: src/main/java/com/squareup/protoparser/DataType.java
// final class NamedType implements DataType {
//   public static NamedType create(String name) {
//     return new NamedType(checkNotNull(name, "name"));
//   }
// 
//   private final String name;
// 
//   private NamedType(String name) {
//     this.name = name;
//   }
// 
//   public String name() {
//     return name;
//   }
// 
//   @Override public Kind kind() {
//     return Kind.NAMED;
//   }
// 
//   @Override public String toString() {
//     return name;
//   }
// 
//   @Override public boolean equals(Object obj) {
//     if (obj == this) return true;
//     if (!(obj instanceof NamedType)) return false;
//     NamedType other = (NamedType) obj;
//     return name.equals(other.name);
//   }
// 
//   @Override public int hashCode() {
//     return name.hashCode();
//   }
// }
// 
// Path: src/main/java/com/squareup/protoparser/Utils.java
// static void appendDocumentation(StringBuilder builder, String documentation) {
//   if (documentation.isEmpty()) {
//     return;
//   }
//   for (String line : documentation.split("\n")) {
//     builder.append("// ").append(line).append('\n');
//   }
// }
// 
// Path: src/main/java/com/squareup/protoparser/Utils.java
// static void appendIndented(StringBuilder builder, String value) {
//   for (String line : value.split("\n")) {
//     builder.append("  ").append(line).append('\n');
//   }
// }
// 
// Path: src/main/java/com/squareup/protoparser/Utils.java
// static <T> T checkNotNull(T value, String name) {
//   if (value == null) {
//     throw new NullPointerException(name + " == null");
//   }
//   return value;
// }
// 
// Path: src/main/java/com/squareup/protoparser/Utils.java
// static <T> List<T> immutableCopyOf(List<T> list) {
//   return unmodifiableList(new ArrayList<>(list));
// }


// Path: src/main/java/com/squareup/protoparser/RpcElement.java
import com.google.auto.value.AutoValue;
import com.squareup.protoparser.DataType.NamedType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static com.squareup.protoparser.Utils.appendDocumentation;
import static com.squareup.protoparser.Utils.appendIndented;
import static com.squareup.protoparser.Utils.checkNotNull;
import static com.squareup.protoparser.Utils.immutableCopyOf;

// Copyright 2014 Square, Inc.
package com.squareup.protoparser;



@AutoValue
public abstract class RpcElement {
  public static Builder builder() {
    return new Builder();
  }

  RpcElement() {
  }

  public abstract String name();
  public abstract String documentation();
  public abstract NamedType requestType();
  public abstract NamedType responseType();
  public abstract List<OptionElement> options();

  public final String toSchema() {