// *** WARNING: this file was generated by pulumi-java-gen. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***

package com.pulumi.gcp.compute.outputs;

import com.pulumi.core.annotations.CustomType;
import com.pulumi.gcp.compute.outputs.RegionUrlMapPathMatcherRouteRuleHeaderAction;
import com.pulumi.gcp.compute.outputs.RegionUrlMapPathMatcherRouteRuleMatchRule;
import com.pulumi.gcp.compute.outputs.RegionUrlMapPathMatcherRouteRuleRouteAction;
import com.pulumi.gcp.compute.outputs.RegionUrlMapPathMatcherRouteRuleUrlRedirect;
import java.lang.Integer;
import java.lang.String;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Nullable;

@CustomType
public final class RegionUrlMapPathMatcherRouteRule {
    /**
     * @return Specifies changes to request and response headers that need to take effect for
     * the selected backendService. The headerAction specified here are applied before
     * the matching pathMatchers[].headerAction and after pathMatchers[].routeRules[].r
     * outeAction.weightedBackendService.backendServiceWeightAction[].headerAction
     * Structure is documented below.
     * 
     */
    private @Nullable RegionUrlMapPathMatcherRouteRuleHeaderAction headerAction;
    /**
     * @return The rules for determining a match.
     * Structure is documented below.
     * 
     */
    private @Nullable List<RegionUrlMapPathMatcherRouteRuleMatchRule> matchRules;
    /**
     * @return For routeRules within a given pathMatcher, priority determines the order
     * in which load balancer will interpret routeRules. RouteRules are evaluated
     * in order of priority, from the lowest to highest number. The priority of
     * a rule decreases as its number increases (1, 2, 3, N+1). The first rule
     * that matches the request is applied.
     * You cannot configure two or more routeRules with the same priority.
     * Priority for each rule must be set to a number between 0 and
     * 2147483647 inclusive.
     * Priority numbers can have gaps, which enable you to add or remove rules
     * in the future without affecting the rest of the rules. For example,
     * 1, 2, 3, 4, 5, 9, 12, 16 is a valid series of priority numbers to which
     * you could add rules numbered from 6 to 8, 10 to 11, and 13 to 15 in the
     * future without any impact on existing rules.
     * 
     */
    private Integer priority;
    /**
     * @return In response to a matching matchRule, the load balancer performs advanced routing
     * actions like URL rewrites, header transformations, etc. prior to forwarding the
     * request to the selected backend. If  routeAction specifies any
     * weightedBackendServices, service must not be set. Conversely if service is set,
     * routeAction cannot contain any  weightedBackendServices. Only one of routeAction
     * or urlRedirect must be set.
     * Structure is documented below.
     * 
     */
    private @Nullable RegionUrlMapPathMatcherRouteRuleRouteAction routeAction;
    /**
     * @return The region backend service resource to which traffic is
     * directed if this rule is matched. If routeAction is additionally specified,
     * advanced routing actions like URL Rewrites, etc. take effect prior to sending
     * the request to the backend. However, if service is specified, routeAction cannot
     * contain any weightedBackendService s. Conversely, if routeAction specifies any
     * weightedBackendServices, service must not be specified. Only one of urlRedirect,
     * service or routeAction.weightedBackendService must be set.
     * 
     */
    private @Nullable String service;
    /**
     * @return When this rule is matched, the request is redirected to a URL specified by
     * urlRedirect. If urlRedirect is specified, service or routeAction must not be
     * set.
     * Structure is documented below.
     * 
     */
    private @Nullable RegionUrlMapPathMatcherRouteRuleUrlRedirect urlRedirect;

    private RegionUrlMapPathMatcherRouteRule() {}
    /**
     * @return Specifies changes to request and response headers that need to take effect for
     * the selected backendService. The headerAction specified here are applied before
     * the matching pathMatchers[].headerAction and after pathMatchers[].routeRules[].r
     * outeAction.weightedBackendService.backendServiceWeightAction[].headerAction
     * Structure is documented below.
     * 
     */
    public Optional<RegionUrlMapPathMatcherRouteRuleHeaderAction> headerAction() {
        return Optional.ofNullable(this.headerAction);
    }
    /**
     * @return The rules for determining a match.
     * Structure is documented below.
     * 
     */
    public List<RegionUrlMapPathMatcherRouteRuleMatchRule> matchRules() {
        return this.matchRules == null ? List.of() : this.matchRules;
    }
    /**
     * @return For routeRules within a given pathMatcher, priority determines the order
     * in which load balancer will interpret routeRules. RouteRules are evaluated
     * in order of priority, from the lowest to highest number. The priority of
     * a rule decreases as its number increases (1, 2, 3, N+1). The first rule
     * that matches the request is applied.
     * You cannot configure two or more routeRules with the same priority.
     * Priority for each rule must be set to a number between 0 and
     * 2147483647 inclusive.
     * Priority numbers can have gaps, which enable you to add or remove rules
     * in the future without affecting the rest of the rules. For example,
     * 1, 2, 3, 4, 5, 9, 12, 16 is a valid series of priority numbers to which
     * you could add rules numbered from 6 to 8, 10 to 11, and 13 to 15 in the
     * future without any impact on existing rules.
     * 
     */
    public Integer priority() {
        return this.priority;
    }
    /**
     * @return In response to a matching matchRule, the load balancer performs advanced routing
     * actions like URL rewrites, header transformations, etc. prior to forwarding the
     * request to the selected backend. If  routeAction specifies any
     * weightedBackendServices, service must not be set. Conversely if service is set,
     * routeAction cannot contain any  weightedBackendServices. Only one of routeAction
     * or urlRedirect must be set.
     * Structure is documented below.
     * 
     */
    public Optional<RegionUrlMapPathMatcherRouteRuleRouteAction> routeAction() {
        return Optional.ofNullable(this.routeAction);
    }
    /**
     * @return The region backend service resource to which traffic is
     * directed if this rule is matched. If routeAction is additionally specified,
     * advanced routing actions like URL Rewrites, etc. take effect prior to sending
     * the request to the backend. However, if service is specified, routeAction cannot
     * contain any weightedBackendService s. Conversely, if routeAction specifies any
     * weightedBackendServices, service must not be specified. Only one of urlRedirect,
     * service or routeAction.weightedBackendService must be set.
     * 
     */
    public Optional<String> service() {
        return Optional.ofNullable(this.service);
    }
    /**
     * @return When this rule is matched, the request is redirected to a URL specified by
     * urlRedirect. If urlRedirect is specified, service or routeAction must not be
     * set.
     * Structure is documented below.
     * 
     */
    public Optional<RegionUrlMapPathMatcherRouteRuleUrlRedirect> urlRedirect() {
        return Optional.ofNullable(this.urlRedirect);
    }

    public static Builder builder() {
        return new Builder();
    }

    public static Builder builder(RegionUrlMapPathMatcherRouteRule defaults) {
        return new Builder(defaults);
    }
    @CustomType.Builder
    public static final class Builder {
        private @Nullable RegionUrlMapPathMatcherRouteRuleHeaderAction headerAction;
        private @Nullable List<RegionUrlMapPathMatcherRouteRuleMatchRule> matchRules;
        private Integer priority;
        private @Nullable RegionUrlMapPathMatcherRouteRuleRouteAction routeAction;
        private @Nullable String service;
        private @Nullable RegionUrlMapPathMatcherRouteRuleUrlRedirect urlRedirect;
        public Builder() {}
        public Builder(RegionUrlMapPathMatcherRouteRule defaults) {
    	      Objects.requireNonNull(defaults);
    	      this.headerAction = defaults.headerAction;
    	      this.matchRules = defaults.matchRules;
    	      this.priority = defaults.priority;
    	      this.routeAction = defaults.routeAction;
    	      this.service = defaults.service;
    	      this.urlRedirect = defaults.urlRedirect;
        }

        @CustomType.Setter
        public Builder headerAction(@Nullable RegionUrlMapPathMatcherRouteRuleHeaderAction headerAction) {
            this.headerAction = headerAction;
            return this;
        }
        @CustomType.Setter
        public Builder matchRules(@Nullable List<RegionUrlMapPathMatcherRouteRuleMatchRule> matchRules) {
            this.matchRules = matchRules;
            return this;
        }
        public Builder matchRules(RegionUrlMapPathMatcherRouteRuleMatchRule... matchRules) {
            return matchRules(List.of(matchRules));
        }
        @CustomType.Setter
        public Builder priority(Integer priority) {
            this.priority = Objects.requireNonNull(priority);
            return this;
        }
        @CustomType.Setter
        public Builder routeAction(@Nullable RegionUrlMapPathMatcherRouteRuleRouteAction routeAction) {
            this.routeAction = routeAction;
            return this;
        }
        @CustomType.Setter
        public Builder service(@Nullable String service) {
            this.service = service;
            return this;
        }
        @CustomType.Setter
        public Builder urlRedirect(@Nullable RegionUrlMapPathMatcherRouteRuleUrlRedirect urlRedirect) {
            this.urlRedirect = urlRedirect;
            return this;
        }
        public RegionUrlMapPathMatcherRouteRule build() {
            final var o = new RegionUrlMapPathMatcherRouteRule();
            o.headerAction = headerAction;
            o.matchRules = matchRules;
            o.priority = priority;
            o.routeAction = routeAction;
            o.service = service;
            o.urlRedirect = urlRedirect;
            return o;
        }
    }
}
