// Copyright 2017 Google Inc. All Rights Reserved.
//
// 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 FILE IS AUTOMATICALLY GENERATED.

syntax = "proto3";

package openapi.v2;

import "google/protobuf/any.proto";

// This option lets the proto compiler generate Java code inside the package
// name (see below) instead of inside an outer class. It creates a simpler
// developer experience by reducing one-level of name nesting and be
// consistent with most programming languages that don't support outer classes.
option java_multiple_files = true;

// The Java outer classname should be the filename in UpperCamelCase. This
// class is only used to hold proto descriptor, so developers don't need to
// work with it directly.
option java_outer_classname = "OpenAPIProto";

// The Java package name must be proto package name with proper prefix.
option java_package = "org.openapi_v2";

// A reasonable prefix for the Objective-C symbols generated from the package.
// It should at a minimum be 3 characters long, all uppercase, and convention
// is to use an abbreviation of the package name. Something short, but
// hopefully unique enough to not conflict with things that may come along in
// the future. 'GPB' is reserved for the protocol buffer implementation itself.
option objc_class_prefix = "OAS";

message AdditionalPropertiesItem {
  oneof oneof {
    Schema schema = 1;
    bool boolean = 2;
  }
}

message Any {
  google.protobuf.Any value = 1;
  string yaml = 2;
}

message ApiKeySecurity {
  string type = 1;
  string name = 2;
  string in = 3;
  string description = 4;
  repeated NamedAny vendor_extension = 5;
}

message BasicAuthenticationSecurity {
  string type = 1;
  string description = 2;
  repeated NamedAny vendor_extension = 3;
}

message BodyParameter {
  // A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
  string description = 1;
  // The name of the parameter.
  string name = 2;
  // Determines the location of the parameter.
  string in = 3;
  // Determines whether or not this parameter is required or optional.
  bool required = 4;
  Schema schema = 5;
  repeated NamedAny vendor_extension = 6;
}

// Contact information for the owners of the API.
message Contact {
  // The identifying name of the contact person/organization.
  string name = 1;
  // The URL pointing to the contact information.
  string url = 2;
  // The email address of the contact person/organization.
  string email = 3;
  repeated NamedAny vendor_extension = 4;
}

message Default {
  repeated NamedAny additional_properties = 1;
}

// One or more JSON objects describing the schemas being consumed and produced by the API.
message Definitions {
  repeated NamedSchema additional_properties = 1;
}

message Document {
  // The Swagger version of this document.
  string swagger = 1;
  Info info = 2;
  // The host (name or ip) of the API. Example: 'swagger.io'
  string host = 3;
  // The base path to the API. Example: '/api'.
  string base_path = 4;
  // The transfer protocol of the API.
  repeated string schemes = 5;
  // A list of MIME types accepted by the API.
  repeated string consumes = 6;
  // A list of MIME types the API can produce.
  repeated string produces = 7;
  Paths paths = 8;
  Definitions definitions = 9;
  ParameterDefinitions parameters = 10;
  ResponseDefinitions responses = 11;
  repeated SecurityRequirement security = 12;
  SecurityDefinitions security_definitions = 13;
  repeated Tag tags = 14;
  ExternalDocs external_docs = 15;
  repeated NamedAny vendor_extension = 16;
}

message Examples {
  repeated NamedAny additional_properties = 1;
}

// information about external documentation
message ExternalDocs {
  string description = 1;
  string url = 2;
  repeated NamedAny vendor_extension = 3;
}

// A deterministic version of a JSON Schema object.
message FileSchema {
  string format = 1;
  string title = 2;
  string description = 3;
  Any default = 4;
  repeated string required = 5;
  string type = 6;
  bool read_only = 7;
  ExternalDocs external_docs = 8;
  Any example = 9;
  repeated NamedAny vendor_extension = 10;
}

message FormDataParameterSubSchema {
  // Determines whether or not this parameter is required or optional.
  bool required = 1;
  // Determines the location of the parameter.
  string in = 2;
  // A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
  string description = 3;
  // The name of the parameter.
  string name = 4;
  // allows sending a parameter by name only or with an empty value.
  bool allow_empty_value = 5;
  string type = 6;
  string format = 7;
  PrimitivesItems items = 8;
  string collection_format = 9;
  Any default = 10;
  double maximum = 11;
  bool exclusive_maximum = 12;
  double minimum = 13;
  bool exclusive_minimum = 14;
  int64 max_length = 15;
  int64 min_length = 16;
  string pattern = 17;
  int64 max_items = 18;
  int64 min_items = 19;
  bool unique_items = 20;
  repeated Any enum = 21;
  double multiple_of = 22;
  repeated NamedAny vendor_extension = 23;
}

message Header {
  string type = 1;
  string format = 2;
  PrimitivesItems items = 3;
  string collection_format = 4;
  Any default = 5;
  double maximum = 6;
  bool exclusive_maximum = 7;
  double minimum = 8;
  bool exclusive_minimum = 9;
  int64 max_length = 10;
  int64 min_length = 11;
  string pattern = 12;
  int64 max_items = 13;
  int64 min_items = 14;
  bool unique_items = 15;
  repeated Any enum = 16;
  double multiple_of = 17;
  string description = 18;
  repeated NamedAny vendor_extension = 19;
}

message HeaderParameterSubSchema {
  // Determines whether or not this parameter is required or optional.
  bool required = 1;
  // Determines the location of the parameter.
  string in = 2;
  // A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
  string description = 3;
  // The name of the parameter.
  string name = 4;
  string type = 5;
  string format = 6;
  PrimitivesItems items = 7;
  string collection_format = 8;
  Any default = 9;
  double maximum = 10;
  bool exclusive_maximum = 11;
  double minimum = 12;
  bool exclusive_minimum = 13;
  int64 max_length = 14;
  int64 min_length = 15;
  string pattern = 16;
  int64 max_items = 17;
  int64 min_items = 18;
  bool unique_items = 19;
  repeated Any enum = 20;
  double multiple_of = 21;
  repeated NamedAny vendor_extension = 22;
}

message Headers {
  repeated NamedHeader additional_properties = 1;
}

// General information about the API.
message Info {
  // A unique and precise title of the API.
  string title = 1;
  // A semantic version number of the API.
  string version = 2;
  // A longer description of the API. Should be different from the title.  GitHub Flavored Markdown is allowed.
  string description = 3;
  // The terms of service for the API.
  string terms_of_service = 4;
  Contact contact = 5;
  License license = 6;
  repeated NamedAny vendor_extension = 7;
}

message ItemsItem {
  repeated Schema schema = 1;
}

message JsonReference {
  string _ref = 1;
  string description = 2;
}

message License {
  // The name of the license type. It's encouraged to use an OSI compatible license.
  string name = 1;
  // The URL pointing to the license.
  string url = 2;
  repeated NamedAny vendor_extension = 3;
}

// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs.
message NamedAny {
  // Map key
  string name = 1;
  // Mapped value
  Any value = 2;
}

// Automatically-generated message used to represent maps of Header as ordered (name,value) pairs.
message NamedHeader {
  // Map key
  string name = 1;
  // Mapped value
  Header value = 2;
}

// Automatically-generated message used to represent maps of Parameter as ordered (name,value) pairs.
message NamedParameter {
  // Map key
  string name = 1;
  // Mapped value
  Parameter value = 2;
}

// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs.
message NamedPathItem {
  // Map key
  string name = 1;
  // Mapped value
  PathItem value = 2;
}

// Automatically-generated message used to represent maps of Response as ordered (name,value) pairs.
message NamedResponse {
  // Map key
  string name = 1;
  // Mapped value
  Response value = 2;
}

// Automatically-generated message used to represent maps of ResponseValue as ordered (name,value) pairs.
message NamedResponseValue {
  // Map key
  string name = 1;
  // Mapped value
  ResponseValue value = 2;
}

// Automatically-generated message used to represent maps of Schema as ordered (name,value) pairs.
message NamedSchema {
  // Map key
  string name = 1;
  // Mapped value
  Schema value = 2;
}

// Automatically-generated message used to represent maps of SecurityDefinitionsItem as ordered (name,value) pairs.
message NamedSecurityDefinitionsItem {
  // Map key
  string name = 1;
  // Mapped value
  SecurityDefinitionsItem value = 2;
}

// Automatically-generated message used to represent maps of string as ordered (name,value) pairs.
message NamedString {
  // Map key
  string name = 1;
  // Mapped value
  string value = 2;
}

// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs.
message NamedStringArray {
  // Map key
  string name = 1;
  // Mapped value
  StringArray value = 2;
}

message NonBodyParameter {
  oneof oneof {
    HeaderParameterSubSchema header_parameter_sub_schema = 1;
    FormDataParameterSubSchema form_data_parameter_sub_schema = 2;
    QueryParameterSubSchema query_parameter_sub_schema = 3;
    PathParameterSubSchema path_parameter_sub_schema = 4;
  }
}

message Oauth2AccessCodeSecurity {
  string type = 1;
  string flow = 2;
  Oauth2Scopes scopes = 3;
  string authorization_url = 4;
  string token_url = 5;
  string description = 6;
  repeated NamedAny vendor_extension = 7;
}

message Oauth2ApplicationSecurity {
  string type = 1;
  string flow = 2;
  Oauth2Scopes scopes = 3;
  string token_url = 4;
  string description = 5;
  repeated NamedAny vendor_extension = 6;
}

message Oauth2ImplicitSecurity {
  string type = 1;
  string flow = 2;
  Oauth2Scopes scopes = 3;
  string authorization_url = 4;
  string description = 5;
  repeated NamedAny vendor_extension = 6;
}

message Oauth2PasswordSecurity {
  string type = 1;
  string flow = 2;
  Oauth2Scopes scopes = 3;
  string token_url = 4;
  string description = 5;
  repeated NamedAny vendor_extension = 6;
}

message Oauth2Scopes {
  repeated NamedString additional_properties = 1;
}

message Operation {
  repeated string tags = 1;
  // A brief summary of the operation.
  string summary = 2;
  // A longer description of the operation, GitHub Flavored Markdown is allowed.
  string description = 3;
  ExternalDocs external_docs = 4;
  // A unique identifier of the operation.
  string operation_id = 5;
  // A list of MIME types the API can produce.
  repeated string produces = 6;
  // A list of MIME types the API can consume.
  repeated string consumes = 7;
  // The parameters needed to send a valid API call.
  repeated ParametersItem parameters = 8;
  Responses responses = 9;
  // The transfer protocol of the API.
  repeated string schemes = 10;
  bool deprecated = 11;
  repeated SecurityRequirement security = 12;
  repeated NamedAny vendor_extension = 13;
}

message Parameter {
  oneof oneof {
    BodyParameter body_parameter = 1;
    NonBodyParameter non_body_parameter = 2;
  }
}

// One or more JSON representations for parameters
message ParameterDefinitions {
  repeated NamedParameter additional_properties = 1;
}

message ParametersItem {
  oneof oneof {
    Parameter parameter = 1;
    JsonReference json_reference = 2;
  }
}

message PathItem {
  string _ref = 1;
  Operation get = 2;
  Operation put = 3;
  Operation post = 4;
  Operation delete = 5;
  Operation options = 6;
  Operation head = 7;
  Operation patch = 8;
  // The parameters needed to send a valid API call.
  repeated ParametersItem parameters = 9;
  repeated NamedAny vendor_extension = 10;
}

message PathParameterSubSchema {
  // Determines whether or not this parameter is required or optional.
  bool required = 1;
  // Determines the location of the parameter.
  string in = 2;
  // A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
  string description = 3;
  // The name of the parameter.
  string name = 4;
  string type = 5;
  string format = 6;
  PrimitivesItems items = 7;
  string collection_format = 8;
  Any default = 9;
  double maximum = 10;
  bool exclusive_maximum = 11;
  double minimum = 12;
  bool exclusive_minimum = 13;
  int64 max_length = 14;
  int64 min_length = 15;
  string pattern = 16;
  int64 max_items = 17;
  int64 min_items = 18;
  bool unique_items = 19;
  repeated Any enum = 20;
  double multiple_of = 21;
  repeated NamedAny vendor_extension = 22;
}

// Relative paths to the individual endpoints. They must be relative to the 'basePath'.
message Paths {
  repeated NamedAny vendor_extension = 1;
  repeated NamedPathItem path = 2;
}

message PrimitivesItems {
  string type = 1;
  string format = 2;
  PrimitivesItems items = 3;
  string collection_format = 4;
  Any default = 5;
  double maximum = 6;
  bool exclusive_maximum = 7;
  double minimum = 8;
  bool exclusive_minimum = 9;
  int64 max_length = 10;
  int64 min_length = 11;
  string pattern = 12;
  int64 max_items = 13;
  int64 min_items = 14;
  bool unique_items = 15;
  repeated Any enum = 16;
  double multiple_of = 17;
  repeated NamedAny vendor_extension = 18;
}

message Properties {
  repeated NamedSchema additional_properties = 1;
}

message QueryParameterSubSchema {
  // Determines whether or not this parameter is required or optional.
  bool required = 1;
  // Determines the location of the parameter.
  string in = 2;
  // A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
  string description = 3;
  // The name of the parameter.
  string name = 4;
  // allows sending a parameter by name only or with an empty value.
  bool allow_empty_value = 5;
  string type = 6;
  string format = 7;
  PrimitivesItems items = 8;
  string collection_format = 9;
  Any default = 10;
  double maximum = 11;
  bool exclusive_maximum = 12;
  double minimum = 13;
  bool exclusive_minimum = 14;
  int64 max_length = 15;
  int64 min_length = 16;
  string pattern = 17;
  int64 max_items = 18;
  int64 min_items = 19;
  bool unique_items = 20;
  repeated Any enum = 21;
  double multiple_of = 22;
  repeated NamedAny vendor_extension = 23;
}

message Response {
  string description = 1;
  SchemaItem schema = 2;
  Headers headers = 3;
  Examples examples = 4;
  repeated NamedAny vendor_extension = 5;
}

// One or more JSON representations for parameters
message ResponseDefinitions {
  repeated NamedResponse additional_properties = 1;
}

message ResponseValue {
  oneof oneof {
    Response response = 1;
    JsonReference json_reference = 2;
  }
}

// Response objects names can either be any valid HTTP status code or 'default'.
message Responses {
  repeated NamedResponseValue response_code = 1;
  repeated NamedAny vendor_extension = 2;
}

// A deterministic version of a JSON Schema object.
message Schema {
  string _ref = 1;
  string format = 2;
  string title = 3;
  string description = 4;
  Any default = 5;
  double multiple_of = 6;
  double maximum = 7;
  bool exclusive_maximum = 8;
  double minimum = 9;
  bool exclusive_minimum = 10;
  int64 max_length = 11;
  int64 min_length = 12;
  string pattern = 13;
  int64 max_items = 14;
  int64 min_items = 15;
  bool unique_items = 16;
  int64 max_properties = 17;
  int64 min_properties = 18;
  repeated string required = 19;
  repeated Any enum = 20;
  AdditionalPropertiesItem additional_properties = 21;
  TypeItem type = 22;
  ItemsItem items = 23;
  repeated Schema all_of = 24;
  Properties properties = 25;
  string discriminator = 26;
  bool read_only = 27;
  Xml xml = 28;
  ExternalDocs external_docs = 29;
  Any example = 30;
  repeated NamedAny vendor_extension = 31;
}

message SchemaItem {
  oneof oneof {
    Schema schema = 1;
    FileSchema file_schema = 2;
  }
}

message SecurityDefinitions {
  repeated NamedSecurityDefinitionsItem additional_properties = 1;
}

message SecurityDefinitionsItem {
  oneof oneof {
    BasicAuthenticationSecurity basic_authentication_security = 1;
    ApiKeySecurity api_key_security = 2;
    Oauth2ImplicitSecurity oauth2_implicit_security = 3;
    Oauth2PasswordSecurity oauth2_password_security = 4;
    Oauth2ApplicationSecurity oauth2_application_security = 5;
    Oauth2AccessCodeSecurity oauth2_access_code_security = 6;
  }
}

message SecurityRequirement {
  repeated NamedStringArray additional_properties = 1;
}

message StringArray {
  repeated string value = 1;
}

message Tag {
  string name = 1;
  string description = 2;
  ExternalDocs external_docs = 3;
  repeated NamedAny vendor_extension = 4;
}

message TypeItem {
  repeated string value = 1;
}

// Any property starting with x- is valid.
message VendorExtension {
  repeated NamedAny additional_properties = 1;
}

message Xml {
  string name = 1;
  string namespace = 2;
  string prefix = 3;
  bool attribute = 4;
  bool wrapped = 5;
  repeated NamedAny vendor_extension = 6;
}
