// Copyright 2017 Google Inc.
//
// 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.

syntax = "proto3";

package google.api;

option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig";
option java_multiple_files = true;
option java_outer_classname = "SystemParameterProto";
option java_package = "com.google.api";
option objc_class_prefix = "GAPI";


// ### System parameter configuration
//
// A system parameter is a special kind of parameter defined by the API
// system, not by an individual API. It is typically mapped to an HTTP header
// and/or a URL query parameter. This configuration specifies which methods
// change the names of the system parameters.
message SystemParameters {
  // Define system parameters.
  //
  // The parameters defined here will override the default parameters
  // implemented by the system. If this field is missing from the service
  // config, default system parameters will be used. Default system parameters
  // and names is implementation-dependent.
  //
  // Example: define api key for all methods
  //
  //     system_parameters
  //       rules:
  //         - selector: "*"
  //           parameters:
  //             - name: api_key
  //               url_query_parameter: api_key
  //
  //
  // Example: define 2 api key names for a specific method.
  //
  //     system_parameters
  //       rules:
  //         - selector: "/ListShelves"
  //           parameters:
  //             - name: api_key
  //               http_header: Api-Key1
  //             - name: api_key
  //               http_header: Api-Key2
  //
  // **NOTE:** All service configuration rules follow "last one wins" order.
  repeated SystemParameterRule rules = 1;
}

// Define a system parameter rule mapping system parameter definitions to
// methods.
message SystemParameterRule {
  // Selects the methods to which this rule applies. Use '*' to indicate all
  // methods in all APIs.
  //
  // Refer to [selector][google.api.DocumentationRule.selector] for syntax details.
  string selector = 1;

  // Define parameters. Multiple names may be defined for a parameter.
  // For a given method call, only one of them should be used. If multiple
  // names are used the behavior is implementation-dependent.
  // If none of the specified names are present the behavior is
  // parameter-dependent.
  repeated SystemParameter parameters = 2;
}

// Define a parameter's name and location. The parameter may be passed as either
// an HTTP header or a URL query parameter, and if both are passed the behavior
// is implementation-dependent.
message SystemParameter {
  // Define the name of the parameter, such as "api_key" . It is case sensitive.
  string name = 1;

  // Define the HTTP header name to use for the parameter. It is case
  // insensitive.
  string http_header = 2;

  // Define the URL query parameter name to use for the parameter. It is case
  // sensitive.
  string url_query_parameter = 3;
}
