import type { Construct } from 'constructs';
import type { CfnGatewayRoute } from './appmesh.generated';
import type { HeaderMatch } from './header-match';
import type { HttpRouteMethod } from './http-route-method';
import { HttpGatewayRoutePathMatch } from './http-route-path-match';
import type { QueryParameterMatch } from './query-parameter-match';
import type { IVirtualService } from './virtual-service';
/**
 * Configuration for gateway route host name match.
 */
export interface GatewayRouteHostnameMatchConfig {
    /**
     * GatewayRoute CFN configuration for host name match.
     */
    readonly hostnameMatch: CfnGatewayRoute.GatewayRouteHostnameMatchProperty;
}
/**
 * Used to generate host name matching methods.
 */
export declare abstract class GatewayRouteHostnameMatch {
    /**
     * The value of the host name must match the specified value exactly.
     *
     * @param name The exact host name to match on
     */
    static exactly(name: string): GatewayRouteHostnameMatch;
    /**
     * The value of the host name with the given name must end with the specified characters.
     *
     * @param suffix The specified ending characters of the host name to match on
     */
    static endsWith(suffix: string): GatewayRouteHostnameMatch;
    /**
     * Returns the gateway route host name match configuration.
     */
    abstract bind(scope: Construct): GatewayRouteHostnameMatchConfig;
}
/**
 * The criterion for determining a request match for this GatewayRoute.
 */
export interface HttpGatewayRouteMatch {
    /**
     * Specify how to match requests based on the 'path' part of their URL.
     *
     * @default - matches requests with any path
     */
    readonly path?: HttpGatewayRoutePathMatch;
    /**
     * Specifies the client request headers to match on. All specified headers
     * must match for the gateway route to match.
     *
     * @default - do not match on headers
     */
    readonly headers?: HeaderMatch[];
    /**
     * The gateway route host name to be matched on.
     *
     * @default - do not match on host name
     */
    readonly hostname?: GatewayRouteHostnameMatch;
    /**
     * The method to match on.
     *
     * @default - do not match on method
     */
    readonly method?: HttpRouteMethod;
    /**
     * The query parameters to match on.
     * All specified query parameters must match for the route to match.
     *
     * @default - do not match on query parameters
     */
    readonly queryParameters?: QueryParameterMatch[];
    /**
     * When `true`, rewrites the original request received at the Virtual Gateway to the destination Virtual Service name.
     * When `false`, retains the original hostname from the request.
     *
     * @default true
     */
    readonly rewriteRequestHostname?: boolean;
    /**
     * The port number to match on.
     *
     * @default - no default port
     */
    readonly port?: number;
}
/**
 * The criterion for determining a request match for this GatewayRoute
 */
export interface GrpcGatewayRouteMatch {
    /**
     * Create service name based gRPC gateway route match.
     *
     * @default - no matching on service name
     */
    readonly serviceName?: string;
    /**
     * Create host name based gRPC gateway route match.
     *
     * @default - no matching on host name
     */
    readonly hostname?: GatewayRouteHostnameMatch;
    /**
     * Create metadata based gRPC gateway route match.
     * All specified metadata must match for the route to match.
     *
     * @default - no matching on metadata
     */
    readonly metadata?: HeaderMatch[];
    /**
     * When `true`, rewrites the original request received at the Virtual Gateway to the destination Virtual Service name.
     * When `false`, retains the original hostname from the request.
     *
     * @default true
     */
    readonly rewriteRequestHostname?: boolean;
    /**
     * The port to match from the request.
     *
     * @default - do not match on port
     */
    readonly port?: number;
}
/**
 * Base options for all gateway route specs.
 */
export interface CommonGatewayRouteSpecOptions {
    /**
     * The priority for the gateway route. When a Virtual Gateway has multiple gateway routes, gateway route match
     * is performed in the order of specified value, where 0 is the highest priority,
     * and first matched gateway route is selected.
     *
     * @default - no particular priority
     */
    readonly priority?: number;
}
/**
 * Properties specific for HTTP Based GatewayRoutes
 */
export interface HttpGatewayRouteSpecOptions extends CommonGatewayRouteSpecOptions {
    /**
     * The criterion for determining a request match for this GatewayRoute.
     * When path match is defined, this may optionally determine the path rewrite configuration.
     *
     * @default - matches any path and automatically rewrites the path to '/'
     */
    readonly match?: HttpGatewayRouteMatch;
    /**
     * The VirtualService this GatewayRoute directs traffic to
     */
    readonly routeTarget: IVirtualService;
}
/**
 * Properties specific for a gRPC GatewayRoute
 */
export interface GrpcGatewayRouteSpecOptions extends CommonGatewayRouteSpecOptions {
    /**
     * The criterion for determining a request match for this GatewayRoute
     */
    readonly match: GrpcGatewayRouteMatch;
    /**
     * The VirtualService this GatewayRoute directs traffic to
     */
    readonly routeTarget: IVirtualService;
}
/**
 * All Properties for GatewayRoute Specs
 */
export interface GatewayRouteSpecConfig {
    /**
     * The spec for an http gateway route
     *
     * @default - no http spec
     */
    readonly httpSpecConfig?: CfnGatewayRoute.HttpGatewayRouteProperty;
    /**
     * The spec for an http2 gateway route
     *
     * @default - no http2 spec
     */
    readonly http2SpecConfig?: CfnGatewayRoute.HttpGatewayRouteProperty;
    /**
     * The spec for a grpc gateway route
     *
     * @default - no grpc spec
     */
    readonly grpcSpecConfig?: CfnGatewayRoute.GrpcGatewayRouteProperty;
    /**
     * The priority for the gateway route. When a Virtual Gateway has multiple gateway routes, gateway route match
     * is performed in the order of specified value, where 0 is the highest priority,
     * and first matched gateway route is selected.
     *
     * @default - no particular priority
     */
    readonly priority?: number;
}
/**
 * Used to generate specs with different protocols for a GatewayRoute
 */
export declare abstract class GatewayRouteSpec {
    /**
     * Creates an HTTP Based GatewayRoute
     *
     * @param options - no http gateway route
     */
    static http(options: HttpGatewayRouteSpecOptions): GatewayRouteSpec;
    /**
     * Creates an HTTP2 Based GatewayRoute
     *
     * @param options - no http2 gateway route
     */
    static http2(options: HttpGatewayRouteSpecOptions): GatewayRouteSpec;
    /**
     * Creates an gRPC Based GatewayRoute
     *
     * @param options - no grpc gateway route
     */
    static grpc(options: GrpcGatewayRouteSpecOptions): GatewayRouteSpec;
    /**
     * Called when the GatewayRouteSpec type is initialized. Can be used to enforce
     * mutual exclusivity with future properties
     */
    abstract bind(scope: Construct): GatewayRouteSpecConfig;
}
