# frozen_string_literal: true

# Copyright 2020 Google LLC
#
# 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
#
#     https://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.

# Auto-generated by gapic-generator-ruby. DO NOT EDIT!


module Google
  module Api
    # A simple descriptor of a resource type.
    #
    # ResourceDescriptor annotates a resource message (either by means of a
    # protobuf annotation or use in the service config), and associates the
    # resource's schema, the resource type, and the pattern of the resource name.
    #
    # Example:
    #
    #     message Topic {
    #       // Indicates this message defines a resource schema.
    #       // Declares the resource type in the format of {service}/{kind}.
    #       // For Kubernetes resources, the format is {api group}/{kind}.
    #       option (google.api.resource) = {
    #         type: "pubsub.googleapis.com/Topic"
    #         name_descriptor: {
    #           pattern: "projects/{project}/topics/{topic}"
    #           parent_type: "cloudresourcemanager.googleapis.com/Project"
    #           parent_name_extractor: "projects/{project}"
    #         }
    #       };
    #     }
    #
    # The ResourceDescriptor Yaml config will look like:
    #
    #     resources:
    #     - type: "pubsub.googleapis.com/Topic"
    #       name_descriptor:
    #         - pattern: "projects/{project}/topics/{topic}"
    #           parent_type: "cloudresourcemanager.googleapis.com/Project"
    #           parent_name_extractor: "projects/{project}"
    #
    # Sometimes, resources have multiple patterns, typically because they can
    # live under multiple parents.
    #
    # Example:
    #
    #     message LogEntry {
    #       option (google.api.resource) = {
    #         type: "logging.googleapis.com/LogEntry"
    #         name_descriptor: {
    #           pattern: "projects/{project}/logs/{log}"
    #           parent_type: "cloudresourcemanager.googleapis.com/Project"
    #           parent_name_extractor: "projects/{project}"
    #         }
    #         name_descriptor: {
    #           pattern: "folders/{folder}/logs/{log}"
    #           parent_type: "cloudresourcemanager.googleapis.com/Folder"
    #           parent_name_extractor: "folders/{folder}"
    #         }
    #         name_descriptor: {
    #           pattern: "organizations/{organization}/logs/{log}"
    #           parent_type: "cloudresourcemanager.googleapis.com/Organization"
    #           parent_name_extractor: "organizations/{organization}"
    #         }
    #         name_descriptor: {
    #           pattern: "billingAccounts/{billing_account}/logs/{log}"
    #           parent_type: "billing.googleapis.com/BillingAccount"
    #           parent_name_extractor: "billingAccounts/{billing_account}"
    #         }
    #       };
    #     }
    #
    # The ResourceDescriptor Yaml config will look like:
    #
    #     resources:
    #     - type: 'logging.googleapis.com/LogEntry'
    #       name_descriptor:
    #         - pattern: "projects/{project}/logs/{log}"
    #           parent_type: "cloudresourcemanager.googleapis.com/Project"
    #           parent_name_extractor: "projects/{project}"
    #         - pattern: "folders/{folder}/logs/{log}"
    #           parent_type: "cloudresourcemanager.googleapis.com/Folder"
    #           parent_name_extractor: "folders/{folder}"
    #         - pattern: "organizations/{organization}/logs/{log}"
    #           parent_type: "cloudresourcemanager.googleapis.com/Organization"
    #           parent_name_extractor: "organizations/{organization}"
    #         - pattern: "billingAccounts/{billing_account}/logs/{log}"
    #           parent_type: "billing.googleapis.com/BillingAccount"
    #           parent_name_extractor: "billingAccounts/{billing_account}"
    #
    # For flexible resources, the resource name doesn't contain parent names, but
    # the resource itself has parents for policy evaluation.
    #
    # Example:
    #
    #     message Shelf {
    #       option (google.api.resource) = {
    #         type: "library.googleapis.com/Shelf"
    #         name_descriptor: {
    #           pattern: "shelves/{shelf}"
    #           parent_type: "cloudresourcemanager.googleapis.com/Project"
    #         }
    #         name_descriptor: {
    #           pattern: "shelves/{shelf}"
    #           parent_type: "cloudresourcemanager.googleapis.com/Folder"
    #         }
    #       };
    #     }
    #
    # The ResourceDescriptor Yaml config will look like:
    #
    #     resources:
    #     - type: 'library.googleapis.com/Shelf'
    #       name_descriptor:
    #         - pattern: "shelves/{shelf}"
    #           parent_type: "cloudresourcemanager.googleapis.com/Project"
    #         - pattern: "shelves/{shelf}"
    #           parent_type: "cloudresourcemanager.googleapis.com/Folder"
    # @!attribute [rw] type
    #   @return [::String]
    #     The resource type. It must be in the format of
    #     \\{service_name}/\\{resource_type_kind}. The `resource_type_kind` must be
    #     singular and must not include version numbers.
    #
    #     Example: `storage.googleapis.com/Bucket`
    #
    #     The value of the resource_type_kind must follow the regular expression
    #     /[A-Za-z][a-zA-Z0-9]+/. It should start with an upper case character and
    #     should use PascalCase (UpperCamelCase). The maximum number of
    #     characters allowed for the `resource_type_kind` is 100.
    # @!attribute [rw] pattern
    #   @return [::Array<::String>]
    #     Optional. The relative resource name pattern associated with this resource
    #     type. The DNS prefix of the full resource name shouldn't be specified here.
    #
    #     The path pattern must follow the syntax, which aligns with HTTP binding
    #     syntax:
    #
    #         Template = Segment { "/" Segment } ;
    #         Segment = LITERAL | Variable ;
    #         Variable = "{" LITERAL "}" ;
    #
    #     Examples:
    #
    #         - "projects/\\{project}/topics/\\{topic}"
    #         - "projects/\\{project}/knowledgeBases/\\{knowledge_base}"
    #
    #     The components in braces correspond to the IDs for each resource in the
    #     hierarchy. It is expected that, if multiple patterns are provided,
    #     the same component name (e.g. "project") refers to IDs of the same
    #     type of resource.
    # @!attribute [rw] name_field
    #   @return [::String]
    #     Optional. The field on the resource that designates the resource name
    #     field. If omitted, this is assumed to be "name".
    # @!attribute [rw] history
    #   @return [::Google::Api::ResourceDescriptor::History]
    #     Optional. The historical or future-looking state of the resource pattern.
    #
    #     Example:
    #
    #         // The InspectTemplate message originally only supported resource
    #         // names with organization, and project was added later.
    #         message InspectTemplate {
    #           option (google.api.resource) = {
    #             type: "dlp.googleapis.com/InspectTemplate"
    #             pattern:
    #             "organizations/{organization}/inspectTemplates/{inspect_template}"
    #             pattern: "projects/{project}/inspectTemplates/{inspect_template}"
    #             history: ORIGINALLY_SINGLE_PATTERN
    #           };
    #         }
    # @!attribute [rw] plural
    #   @return [::String]
    #     The plural name used in the resource name and permission names, such as
    #     'projects' for the resource name of 'projects/\\{project}' and the permission
    #     name of 'cloudresourcemanager.googleapis.com/projects.get'. It is the same
    #     concept of the `plural` field in k8s CRD spec
    #     https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/
    #
    #     Note: The plural form is required even for singleton resources. See
    #     https://aip.dev/156
    # @!attribute [rw] singular
    #   @return [::String]
    #     The same concept of the `singular` field in k8s CRD spec
    #     https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/
    #     Such as "project" for the `resourcemanager.googleapis.com/Project` type.
    # @!attribute [rw] style
    #   @return [::Array<::Google::Api::ResourceDescriptor::Style>]
    #     Style flag(s) for this resource.
    #     These indicate that a resource is expected to conform to a given
    #     style. See the specific style flags for additional information.
    class ResourceDescriptor
      include ::Google::Protobuf::MessageExts
      extend ::Google::Protobuf::MessageExts::ClassMethods

      # A description of the historical or future-looking state of the
      # resource pattern.
      module History
        # The "unset" value.
        HISTORY_UNSPECIFIED = 0

        # The resource originally had one pattern and launched as such, and
        # additional patterns were added later.
        ORIGINALLY_SINGLE_PATTERN = 1

        # The resource has one pattern, but the API owner expects to add more
        # later. (This is the inverse of ORIGINALLY_SINGLE_PATTERN, and prevents
        # that from being necessary once there are multiple patterns.)
        FUTURE_MULTI_PATTERN = 2
      end

      # A flag representing a specific style that a resource claims to conform to.
      module Style
        # The unspecified value. Do not use.
        STYLE_UNSPECIFIED = 0

        # This resource is intended to be "declarative-friendly".
        #
        # Declarative-friendly resources must be more strictly consistent, and
        # setting this to true communicates to tools that this resource should
        # adhere to declarative-friendly expectations.
        #
        # Note: This is used by the API linter (linter.aip.dev) to enable
        # additional checks.
        DECLARATIVE_FRIENDLY = 1
      end
    end

    # Defines a proto annotation that describes a string field that refers to
    # an API resource.
    # @!attribute [rw] type
    #   @return [::String]
    #     The resource type that the annotated field references.
    #
    #     Example:
    #
    #         message Subscription {
    #           string topic = 2 [(google.api.resource_reference) = {
    #             type: "pubsub.googleapis.com/Topic"
    #           }];
    #         }
    #
    #     Occasionally, a field may reference an arbitrary resource. In this case,
    #     APIs use the special value * in their resource reference.
    #
    #     Example:
    #
    #         message GetIamPolicyRequest {
    #           string resource = 2 [(google.api.resource_reference) = {
    #             type: "*"
    #           }];
    #         }
    # @!attribute [rw] child_type
    #   @return [::String]
    #     The resource type of a child collection that the annotated field
    #     references. This is useful for annotating the `parent` field that
    #     doesn't have a fixed resource type.
    #
    #     Example:
    #
    #         message ListLogEntriesRequest {
    #           string parent = 1 [(google.api.resource_reference) = {
    #             child_type: "logging.googleapis.com/LogEntry"
    #           };
    #         }
    class ResourceReference
      include ::Google::Protobuf::MessageExts
      extend ::Google::Protobuf::MessageExts::ClassMethods
    end
  end
end
