// Code generated by sidekick. DO NOT EDIT.
//
// Copyright 2026 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.

#if RegionUrlMaps || UrlMaps
  import Foundation
  import GoogleCloudWkt

  /// A matcher for the path portion of the URL. The BackendService
  /// from the longest-matched rule will serve the URL. If no rule was matched, the
  /// default service is used.
  public struct PathMatcher: Codable, Equatable, GoogleCloudWkt._AnyPackable,
    Sendable
  {
    /// defaultCustomErrorResponsePolicy specifies how the Load
    /// Balancer returns error responses when BackendServiceorBackendBucket responds with an error.
    ///
    /// This policy takes
    /// effect at the PathMatcher level and applies only when no
    /// policy has been defined for the error code at lower levels likeRouteRule and PathRule within thisPathMatcher. If an error code does not have a policy defined
    /// in defaultCustomErrorResponsePolicy, then a policy defined for
    /// the error code in UrlMap.defaultCustomErrorResponsePolicy
    /// takes effect.
    ///
    /// For example, consider a UrlMap with the following
    /// configuration:
    ///
    ///
    ///      - UrlMap.defaultCustomErrorResponsePolicy is configured
    ///      with policies for 5xx and 4xx errors
    ///      - A RouteRule for /coming_soon/ is configured for the
    ///      error code 404.
    ///
    /// If the request is for www.myotherdomain.com and a404 is encountered, the policy underUrlMap.defaultCustomErrorResponsePolicy takes effect. If a404 response is encountered for the requestwww.example.com/current_events/, the pathMatcher's policy
    /// takes effect. If however, the request forwww.example.com/coming_soon/ encounters a 404,
    /// the policy in RouteRule.customErrorResponsePolicy takes
    /// effect. If any of the requests in this example encounter a 500
    /// error code, the policy atUrlMap.defaultCustomErrorResponsePolicy takes effect.
    ///
    /// When
    /// used in conjunction withpathMatcher.defaultRouteAction.retryPolicy, retries take
    /// precedence. Only once all retries are exhausted, thedefaultCustomErrorResponsePolicy is applied. While attempting
    /// a retry, if load balancer is successful in reaching the
    /// service, the defaultCustomErrorResponsePolicy is ignored and
    /// the response from the service is returned to the client.
    ///
    /// defaultCustomErrorResponsePolicy is supported only for
    /// global external Application Load Balancers.
    public var defaultCustomErrorResponsePolicy: CustomErrorResponsePolicy? = nil

    /// defaultRouteAction takes effect when none of the
    /// pathRules or routeRules match. The load balancer
    /// performs advanced routing actions, such as URL rewrites and
    /// header transformations, before forwarding the request to the
    /// selected backend.
    ///
    ///
    /// Only one of defaultUrlRedirect, defaultService
    /// or defaultRouteAction.weightedBackendService can be set.
    ///
    ///
    /// URL maps for classic Application Load Balancers only support
    /// the urlRewrite action within a path matcher'sdefaultRouteAction.
    public var defaultRouteAction: HttpRouteAction? = nil

    /// The full or partial URL to the BackendService resource. This
    /// URL is used if none of the pathRules orrouteRules defined by this PathMatcher are
    /// matched. For example, the
    /// following are all valid URLs to a BackendService resource:
    ///
    ///
    ///      - https://www.googleapis.com/compute/v1/projects/project/global/backendServices/backendService
    ///      - compute/v1/projects/project/global/backendServices/backendService
    ///      - global/backendServices/backendService
    ///
    ///
    /// If defaultRouteAction is also specified, advanced
    /// routing actions, such as URL rewrites, take effect before sending the
    /// request to the backend.
    ///
    ///
    /// Only one of defaultUrlRedirect, defaultService
    /// or defaultRouteAction.weightedBackendService can be set.
    ///
    ///
    /// Authorization requires one or more of the following Google IAM permissions on the
    /// specified resource default_service:
    ///
    ///
    ///       - compute.backendBuckets.use
    ///       - compute.backendServices.use
    public var defaultService: Swift.String? = nil

    /// When none of the specified pathRules orrouteRules match, the request is redirected to a URL specified
    /// by defaultUrlRedirect.
    ///
    ///
    /// Only one of defaultUrlRedirect, defaultService
    /// or defaultRouteAction.weightedBackendService can be set.
    ///
    ///
    /// Not supported when the URL map is bound to a target gRPC proxy.
    public var defaultUrlRedirect: HttpRedirectAction? = nil

    /// An optional description of this resource. Provide this property when you
    /// create the resource.
    public var description: Swift.String? = nil

    /// Specifies changes to request and response headers that need to take effect
    /// for the selected backend service.
    ///
    /// HeaderAction specified here are applied after the matchingHttpRouteRule HeaderAction and before theHeaderAction in the UrlMap
    ///
    /// HeaderAction is not supported for load balancers
    /// that have
    /// their loadBalancingScheme set to EXTERNAL.
    ///
    /// Not supported when the URL map is bound to a target gRPC proxy that
    /// has validateForProxyless field set to true.
    public var headerAction: HttpHeaderAction? = nil

    /// The name to which this PathMatcher is referred by theHostRule.
    public var name: Swift.String? = nil

    /// The list of path rules. Use this list instead of routeRules
    /// when routing based on simple path matching is all that's required. A path
    /// rule can only include a wildcard character (*) after a
    /// forward slash character ("/").
    ///
    /// The order by which path rules are specified does not matter.
    /// Matches are always done on the longest-path-first basis.
    ///
    /// For example: a pathRule with a path /a/b/c/* will match
    /// before /a/b/* irrespective of the order in which those paths appear in this
    /// list.
    ///
    /// Within a given pathMatcher, only one ofpathRules or routeRules must be set.
    public var pathRules: [PathRule] = []

    /// The list of HTTP route rules. Use this list instead ofpathRules when advanced route matching and routing actions are
    /// desired. routeRules are evaluated in order of priority, from
    /// the lowest to highest number.
    ///
    /// Within a given pathMatcher, you can set only one ofpathRules or routeRules.
    public var routeRules: [HttpRouteRule] = []

    /// Initialize a new instance of `PathMatcher`.
    public init() {}

    /// Use `config` to return a new instance of this object, with some fields updated.
    ///
    /// Commonly used to initialize the value, for example:
    ///
    /// ```
    /// let value = PathMatcher().with { $0.defaultCustomErrorResponsePolicy = ... }
    /// ```
    public func with(_ config: (inout Self) throws -> Swift.Void) rethrows -> Self {
      var copy = self
      try config(&copy)
      return copy
    }

    public static var _anyTypeUrl: Swift.String {
      return "type.googleapis.com/google.cloud.compute.v1.PathMatcher"
    }
    public init(fromAny any: GoogleCloudWkt.`Any`) throws {
      self = try GoogleCloudWkt._slowAnyDeserialize(Self.self, from: any)
    }
    public func _pack() throws -> GoogleCloudWkt.Struct {
      return try GoogleCloudWkt._slowAnySerialize(message: self)
    }
  }
#endif
