/*
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
/*
 * This code was generated by https://github.com/googleapis/google-api-java-client-services/
 * Modify at your own risk.
 */

package com.google.api.services.discovery.model;

/**
 * Model definition for RestDescription.
 *
 * <p> This is the Java data model class that specifies how to parse/serialize into the JSON that is
 * transmitted over HTTP when working with the API Discovery Service. For a detailed explanation
 * see:
 * <a href="https://developers.google.com/api-client-library/java/google-http-java-client/json">https://developers.google.com/api-client-library/java/google-http-java-client/json</a>
 * </p>
 *
 * @author Google, Inc.
 */
@SuppressWarnings("javadoc")
public final class RestDescription extends com.google.api.client.json.GenericJson {

  /**
   * Authentication information.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Auth auth;

  /**
   * [DEPRECATED] The base path for REST requests.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String basePath;

  /**
   * [DEPRECATED] The base URL for REST requests.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String baseUrl;

  /**
   * The path for REST batch requests.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String batchPath;

  /**
   * Indicates how the API name should be capitalized and split into various parts. Useful for
   * generating pretty class names.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String canonicalName;

  /**
   * The description of this API.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String description;

  /**
   * Indicate the version of the Discovery API used to generate this doc.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String discoveryVersion;

  /**
   * A link to human readable documentation for the API.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String documentationLink;

  /**
   * The ETag for this response.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String etag;

  /**
   * Enable exponential backoff for suitable methods in the generated clients.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.Boolean exponentialBackoffDefault;

  /**
   * A list of supported features for this API.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.util.List<java.lang.String> features;

  /**
   * Links to 16x16 and 32x32 icons representing the API.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Icons icons;

  /**
   * The ID of this API.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String id;

  /**
   * The kind for this response.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String kind;

  /**
   * Labels for the status of this API, such as labs or deprecated.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.util.List<java.lang.String> labels;

  /**
   * API-level methods for this API.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.util.Map<String, RestMethod> methods;

  /**
   * The name of this API.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String name;

  /**
   * The domain of the owner of this API. Together with the ownerName and a packagePath values, this
   * can be used to generate a library for this API which would have a unique fully qualified name.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String ownerDomain;

  /**
   * The name of the owner of this API. See ownerDomain.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String ownerName;

  /**
   * The package of the owner of this API. See ownerDomain.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String packagePath;

  /**
   * Common parameters that apply across all apis.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.util.Map<String, JsonSchema> parameters;

  static {
    // hack to force ProGuard to consider JsonSchema used, since otherwise it would be stripped out
    // see https://github.com/google/google-api-java-client/issues/543
    com.google.api.client.util.Data.nullOf(JsonSchema.class);
  }

  /**
   * The protocol described by this document.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String protocol;

  /**
   * The resources in this API.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.util.Map<String, RestResource> resources;

  /**
   * The version of this API.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String revision;

  /**
   * The root URL under which all API services live.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String rootUrl;

  /**
   * The schemas for this API.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.util.Map<String, JsonSchema> schemas;

  static {
    // hack to force ProGuard to consider JsonSchema used, since otherwise it would be stripped out
    // see https://github.com/google/google-api-java-client/issues/543
    com.google.api.client.util.Data.nullOf(JsonSchema.class);
  }

  /**
   * The base path for all REST requests.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String servicePath;

  /**
   * The title of this API.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String title;

  /**
   * The version of this API.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String version;

  /**
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key("version_module")
  private java.lang.Boolean versionModule;

  /**
   * Authentication information.
   * @return value or {@code null} for none
   */
  public Auth getAuth() {
    return auth;
  }

  /**
   * Authentication information.
   * @param auth auth or {@code null} for none
   */
  public RestDescription setAuth(Auth auth) {
    this.auth = auth;
    return this;
  }

  /**
   * [DEPRECATED] The base path for REST requests.
   * @return value or {@code null} for none
   */
  public java.lang.String getBasePath() {
    return basePath;
  }

  /**
   * [DEPRECATED] The base path for REST requests.
   * @param basePath basePath or {@code null} for none
   */
  public RestDescription setBasePath(java.lang.String basePath) {
    this.basePath = basePath;
    return this;
  }

  /**
   * [DEPRECATED] The base URL for REST requests.
   * @return value or {@code null} for none
   */
  public java.lang.String getBaseUrl() {
    return baseUrl;
  }

  /**
   * [DEPRECATED] The base URL for REST requests.
   * @param baseUrl baseUrl or {@code null} for none
   */
  public RestDescription setBaseUrl(java.lang.String baseUrl) {
    this.baseUrl = baseUrl;
    return this;
  }

  /**
   * The path for REST batch requests.
   * @return value or {@code null} for none
   */
  public java.lang.String getBatchPath() {
    return batchPath;
  }

  /**
   * The path for REST batch requests.
   * @param batchPath batchPath or {@code null} for none
   */
  public RestDescription setBatchPath(java.lang.String batchPath) {
    this.batchPath = batchPath;
    return this;
  }

  /**
   * Indicates how the API name should be capitalized and split into various parts. Useful for
   * generating pretty class names.
   * @return value or {@code null} for none
   */
  public java.lang.String getCanonicalName() {
    return canonicalName;
  }

  /**
   * Indicates how the API name should be capitalized and split into various parts. Useful for
   * generating pretty class names.
   * @param canonicalName canonicalName or {@code null} for none
   */
  public RestDescription setCanonicalName(java.lang.String canonicalName) {
    this.canonicalName = canonicalName;
    return this;
  }

  /**
   * The description of this API.
   * @return value or {@code null} for none
   */
  public java.lang.String getDescription() {
    return description;
  }

  /**
   * The description of this API.
   * @param description description or {@code null} for none
   */
  public RestDescription setDescription(java.lang.String description) {
    this.description = description;
    return this;
  }

  /**
   * Indicate the version of the Discovery API used to generate this doc.
   * @return value or {@code null} for none
   */
  public java.lang.String getDiscoveryVersion() {
    return discoveryVersion;
  }

  /**
   * Indicate the version of the Discovery API used to generate this doc.
   * @param discoveryVersion discoveryVersion or {@code null} for none
   */
  public RestDescription setDiscoveryVersion(java.lang.String discoveryVersion) {
    this.discoveryVersion = discoveryVersion;
    return this;
  }

  /**
   * A link to human readable documentation for the API.
   * @return value or {@code null} for none
   */
  public java.lang.String getDocumentationLink() {
    return documentationLink;
  }

  /**
   * A link to human readable documentation for the API.
   * @param documentationLink documentationLink or {@code null} for none
   */
  public RestDescription setDocumentationLink(java.lang.String documentationLink) {
    this.documentationLink = documentationLink;
    return this;
  }

  /**
   * The ETag for this response.
   * @return value or {@code null} for none
   */
  public java.lang.String getEtag() {
    return etag;
  }

  /**
   * The ETag for this response.
   * @param etag etag or {@code null} for none
   */
  public RestDescription setEtag(java.lang.String etag) {
    this.etag = etag;
    return this;
  }

  /**
   * Enable exponential backoff for suitable methods in the generated clients.
   * @return value or {@code null} for none
   */
  public java.lang.Boolean getExponentialBackoffDefault() {
    return exponentialBackoffDefault;
  }

  /**
   * Enable exponential backoff for suitable methods in the generated clients.
   * @param exponentialBackoffDefault exponentialBackoffDefault or {@code null} for none
   */
  public RestDescription setExponentialBackoffDefault(java.lang.Boolean exponentialBackoffDefault) {
    this.exponentialBackoffDefault = exponentialBackoffDefault;
    return this;
  }

  /**
   * A list of supported features for this API.
   * @return value or {@code null} for none
   */
  public java.util.List<java.lang.String> getFeatures() {
    return features;
  }

  /**
   * A list of supported features for this API.
   * @param features features or {@code null} for none
   */
  public RestDescription setFeatures(java.util.List<java.lang.String> features) {
    this.features = features;
    return this;
  }

  /**
   * Links to 16x16 and 32x32 icons representing the API.
   * @return value or {@code null} for none
   */
  public Icons getIcons() {
    return icons;
  }

  /**
   * Links to 16x16 and 32x32 icons representing the API.
   * @param icons icons or {@code null} for none
   */
  public RestDescription setIcons(Icons icons) {
    this.icons = icons;
    return this;
  }

  /**
   * The ID of this API.
   * @return value or {@code null} for none
   */
  public java.lang.String getId() {
    return id;
  }

  /**
   * The ID of this API.
   * @param id id or {@code null} for none
   */
  public RestDescription setId(java.lang.String id) {
    this.id = id;
    return this;
  }

  /**
   * The kind for this response.
   * @return value or {@code null} for none
   */
  public java.lang.String getKind() {
    return kind;
  }

  /**
   * The kind for this response.
   * @param kind kind or {@code null} for none
   */
  public RestDescription setKind(java.lang.String kind) {
    this.kind = kind;
    return this;
  }

  /**
   * Labels for the status of this API, such as labs or deprecated.
   * @return value or {@code null} for none
   */
  public java.util.List<java.lang.String> getLabels() {
    return labels;
  }

  /**
   * Labels for the status of this API, such as labs or deprecated.
   * @param labels labels or {@code null} for none
   */
  public RestDescription setLabels(java.util.List<java.lang.String> labels) {
    this.labels = labels;
    return this;
  }

  /**
   * API-level methods for this API.
   * @return value or {@code null} for none
   */
  public java.util.Map<String, RestMethod> getMethods() {
    return methods;
  }

  /**
   * API-level methods for this API.
   * @param methods methods or {@code null} for none
   */
  public RestDescription setMethods(java.util.Map<String, RestMethod> methods) {
    this.methods = methods;
    return this;
  }

  /**
   * The name of this API.
   * @return value or {@code null} for none
   */
  public java.lang.String getName() {
    return name;
  }

  /**
   * The name of this API.
   * @param name name or {@code null} for none
   */
  public RestDescription setName(java.lang.String name) {
    this.name = name;
    return this;
  }

  /**
   * The domain of the owner of this API. Together with the ownerName and a packagePath values, this
   * can be used to generate a library for this API which would have a unique fully qualified name.
   * @return value or {@code null} for none
   */
  public java.lang.String getOwnerDomain() {
    return ownerDomain;
  }

  /**
   * The domain of the owner of this API. Together with the ownerName and a packagePath values, this
   * can be used to generate a library for this API which would have a unique fully qualified name.
   * @param ownerDomain ownerDomain or {@code null} for none
   */
  public RestDescription setOwnerDomain(java.lang.String ownerDomain) {
    this.ownerDomain = ownerDomain;
    return this;
  }

  /**
   * The name of the owner of this API. See ownerDomain.
   * @return value or {@code null} for none
   */
  public java.lang.String getOwnerName() {
    return ownerName;
  }

  /**
   * The name of the owner of this API. See ownerDomain.
   * @param ownerName ownerName or {@code null} for none
   */
  public RestDescription setOwnerName(java.lang.String ownerName) {
    this.ownerName = ownerName;
    return this;
  }

  /**
   * The package of the owner of this API. See ownerDomain.
   * @return value or {@code null} for none
   */
  public java.lang.String getPackagePath() {
    return packagePath;
  }

  /**
   * The package of the owner of this API. See ownerDomain.
   * @param packagePath packagePath or {@code null} for none
   */
  public RestDescription setPackagePath(java.lang.String packagePath) {
    this.packagePath = packagePath;
    return this;
  }

  /**
   * Common parameters that apply across all apis.
   * @return value or {@code null} for none
   */
  public java.util.Map<String, JsonSchema> getParameters() {
    return parameters;
  }

  /**
   * Common parameters that apply across all apis.
   * @param parameters parameters or {@code null} for none
   */
  public RestDescription setParameters(java.util.Map<String, JsonSchema> parameters) {
    this.parameters = parameters;
    return this;
  }

  /**
   * The protocol described by this document.
   * @return value or {@code null} for none
   */
  public java.lang.String getProtocol() {
    return protocol;
  }

  /**
   * The protocol described by this document.
   * @param protocol protocol or {@code null} for none
   */
  public RestDescription setProtocol(java.lang.String protocol) {
    this.protocol = protocol;
    return this;
  }

  /**
   * The resources in this API.
   * @return value or {@code null} for none
   */
  public java.util.Map<String, RestResource> getResources() {
    return resources;
  }

  /**
   * The resources in this API.
   * @param resources resources or {@code null} for none
   */
  public RestDescription setResources(java.util.Map<String, RestResource> resources) {
    this.resources = resources;
    return this;
  }

  /**
   * The version of this API.
   * @return value or {@code null} for none
   */
  public java.lang.String getRevision() {
    return revision;
  }

  /**
   * The version of this API.
   * @param revision revision or {@code null} for none
   */
  public RestDescription setRevision(java.lang.String revision) {
    this.revision = revision;
    return this;
  }

  /**
   * The root URL under which all API services live.
   * @return value or {@code null} for none
   */
  public java.lang.String getRootUrl() {
    return rootUrl;
  }

  /**
   * The root URL under which all API services live.
   * @param rootUrl rootUrl or {@code null} for none
   */
  public RestDescription setRootUrl(java.lang.String rootUrl) {
    this.rootUrl = rootUrl;
    return this;
  }

  /**
   * The schemas for this API.
   * @return value or {@code null} for none
   */
  public java.util.Map<String, JsonSchema> getSchemas() {
    return schemas;
  }

  /**
   * The schemas for this API.
   * @param schemas schemas or {@code null} for none
   */
  public RestDescription setSchemas(java.util.Map<String, JsonSchema> schemas) {
    this.schemas = schemas;
    return this;
  }

  /**
   * The base path for all REST requests.
   * @return value or {@code null} for none
   */
  public java.lang.String getServicePath() {
    return servicePath;
  }

  /**
   * The base path for all REST requests.
   * @param servicePath servicePath or {@code null} for none
   */
  public RestDescription setServicePath(java.lang.String servicePath) {
    this.servicePath = servicePath;
    return this;
  }

  /**
   * The title of this API.
   * @return value or {@code null} for none
   */
  public java.lang.String getTitle() {
    return title;
  }

  /**
   * The title of this API.
   * @param title title or {@code null} for none
   */
  public RestDescription setTitle(java.lang.String title) {
    this.title = title;
    return this;
  }

  /**
   * The version of this API.
   * @return value or {@code null} for none
   */
  public java.lang.String getVersion() {
    return version;
  }

  /**
   * The version of this API.
   * @param version version or {@code null} for none
   */
  public RestDescription setVersion(java.lang.String version) {
    this.version = version;
    return this;
  }

  /**
   * @return value or {@code null} for none
   */
  public java.lang.Boolean getVersionModule() {
    return versionModule;
  }

  /**
   * @param versionModule versionModule or {@code null} for none
   */
  public RestDescription setVersionModule(java.lang.Boolean versionModule) {
    this.versionModule = versionModule;
    return this;
  }

  @Override
  public RestDescription set(String fieldName, Object value) {
    return (RestDescription) super.set(fieldName, value);
  }

  @Override
  public RestDescription clone() {
    return (RestDescription) super.clone();
  }

  /**
   * Authentication information.
   */
  public static final class Auth extends com.google.api.client.json.GenericJson {

    /**
     * OAuth 2.0 authentication information.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private Oauth2 oauth2;

    /**
     * OAuth 2.0 authentication information.
     * @return value or {@code null} for none
     */
    public Oauth2 getOauth2() {
      return oauth2;
    }

    /**
     * OAuth 2.0 authentication information.
     * @param oauth2 oauth2 or {@code null} for none
     */
    public Auth setOauth2(Oauth2 oauth2) {
      this.oauth2 = oauth2;
      return this;
    }

    @Override
    public Auth set(String fieldName, Object value) {
      return (Auth) super.set(fieldName, value);
    }

    @Override
    public Auth clone() {
      return (Auth) super.clone();
    }

    /**
     * OAuth 2.0 authentication information.
     */
    public static final class Oauth2 extends com.google.api.client.json.GenericJson {

      /**
       * Available OAuth 2.0 scopes.
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.util.Map<String, ScopesElement> scopes;

      static {
        // hack to force ProGuard to consider ScopesElement used, since otherwise it would be stripped out
        // see https://github.com/google/google-api-java-client/issues/543
        com.google.api.client.util.Data.nullOf(ScopesElement.class);
      }

      /**
       * Available OAuth 2.0 scopes.
       * @return value or {@code null} for none
       */
      public java.util.Map<String, ScopesElement> getScopes() {
        return scopes;
      }

      /**
       * Available OAuth 2.0 scopes.
       * @param scopes scopes or {@code null} for none
       */
      public Oauth2 setScopes(java.util.Map<String, ScopesElement> scopes) {
        this.scopes = scopes;
        return this;
      }

      @Override
      public Oauth2 set(String fieldName, Object value) {
        return (Oauth2) super.set(fieldName, value);
      }

      @Override
      public Oauth2 clone() {
        return (Oauth2) super.clone();
      }

      /**
       * The scope value.
       */
      public static final class ScopesElement extends com.google.api.client.json.GenericJson {

        /**
         * Description of scope.
         * The value may be {@code null}.
         */
        @com.google.api.client.util.Key
        private java.lang.String description;

        /**
         * Description of scope.
         * @return value or {@code null} for none
         */
        public java.lang.String getDescription() {
          return description;
        }

        /**
         * Description of scope.
         * @param description description or {@code null} for none
         */
        public ScopesElement setDescription(java.lang.String description) {
          this.description = description;
          return this;
        }

        @Override
        public ScopesElement set(String fieldName, Object value) {
          return (ScopesElement) super.set(fieldName, value);
        }

        @Override
        public ScopesElement clone() {
          return (ScopesElement) super.clone();
        }

      }
    }
  }

  /**
   * Links to 16x16 and 32x32 icons representing the API.
   */
  public static final class Icons extends com.google.api.client.json.GenericJson {

    /**
     * The URL of the 16x16 icon.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String x16;

    /**
     * The URL of the 32x32 icon.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String x32;

    /**
     * The URL of the 16x16 icon.
     * @return value or {@code null} for none
     */
    public java.lang.String getX16() {
      return x16;
    }

    /**
     * The URL of the 16x16 icon.
     * @param x16 x16 or {@code null} for none
     */
    public Icons setX16(java.lang.String x16) {
      this.x16 = x16;
      return this;
    }

    /**
     * The URL of the 32x32 icon.
     * @return value or {@code null} for none
     */
    public java.lang.String getX32() {
      return x32;
    }

    /**
     * The URL of the 32x32 icon.
     * @param x32 x32 or {@code null} for none
     */
    public Icons setX32(java.lang.String x32) {
      this.x32 = x32;
      return this;
    }

    @Override
    public Icons set(String fieldName, Object value) {
      return (Icons) super.set(fieldName, value);
    }

    @Override
    public Icons clone() {
      return (Icons) super.clone();
    }

  }

}
