use k8s_openapi::apimachinery::pkg::util::intstr::IntOrString;
use kube::CustomResource;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(CustomResource, Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
#[kube(
group = "traefik.containo.us",
version = "v1alpha1",
kind = "Middleware",
plural = "middlewares"
)]
#[kube(namespaced)]
pub struct MiddlewareSpec {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "addPrefix")]
pub add_prefix: Option<MiddlewareAddPrefix>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "basicAuth")]
pub basic_auth: Option<MiddlewareBasicAuth>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub buffering: Option<MiddlewareBuffering>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub chain: Option<MiddlewareChain>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "circuitBreaker")]
pub circuit_breaker: Option<MiddlewareCircuitBreaker>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub compress: Option<MiddlewareCompress>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "contentType")]
pub content_type: Option<MiddlewareContentType>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "digestAuth")]
pub digest_auth: Option<MiddlewareDigestAuth>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub errors: Option<MiddlewareErrors>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "forwardAuth")]
pub forward_auth: Option<MiddlewareForwardAuth>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "grpcWeb")]
pub grpc_web: Option<MiddlewareGrpcWeb>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub headers: Option<MiddlewareHeaders>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "inFlightReq")]
pub in_flight_req: Option<MiddlewareInFlightReq>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "ipAllowList")]
pub ip_allow_list: Option<MiddlewareIpAllowList>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "passTLSClientCert"
)]
pub pass_tls_client_cert: Option<MiddlewarePassTLSClientCert>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "rateLimit")]
pub rate_limit: Option<MiddlewareRateLimit>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "redirectRegex")]
pub redirect_regex: Option<MiddlewareRedirectRegex>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "redirectScheme")]
pub redirect_scheme: Option<MiddlewareRedirectScheme>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "replacePath")]
pub replace_path: Option<MiddlewareReplacePath>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "replacePathRegex")]
pub replace_path_regex: Option<MiddlewareReplacePathRegex>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub retry: Option<MiddlewareRetry>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "stripPrefix")]
pub strip_prefix: Option<MiddlewareStripPrefix>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "stripPrefixRegex")]
pub strip_prefix_regex: Option<MiddlewareStripPrefixRegex>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareAddPrefix {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prefix: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareBasicAuth {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "headerField")]
pub header_field: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub realm: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "removeHeader")]
pub remove_header: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub secret: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareBuffering {
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "maxRequestBodyBytes"
)]
pub max_request_body_bytes: Option<i64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "maxResponseBodyBytes"
)]
pub max_response_body_bytes: Option<i64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "memRequestBodyBytes"
)]
pub mem_request_body_bytes: Option<i64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "memResponseBodyBytes"
)]
pub mem_response_body_bytes: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "retryExpression")]
pub retry_expression: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareChain {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub middlewares: Option<Vec<MiddlewareChainMiddlewares>>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareChainMiddlewares {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub namespace: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareCircuitBreaker {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "checkPeriod")]
pub check_period: Option<IntOrString>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expression: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "fallbackDuration")]
pub fallback_duration: Option<IntOrString>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "recoveryDuration")]
pub recovery_duration: Option<IntOrString>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareCompress {
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "excludedContentTypes"
)]
pub excluded_content_types: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "minResponseBodyBytes"
)]
pub min_response_body_bytes: Option<i64>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareContentType {}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareDigestAuth {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "headerField")]
pub header_field: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub realm: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "removeHeader")]
pub remove_header: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub secret: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareErrors {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub query: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub service: Option<MiddlewareErrorsService>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareErrorsService {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kind: Option<MiddlewareErrorsServiceKind>,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub namespace: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "passHostHeader")]
pub pass_host_header: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub port: Option<IntOrString>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "responseForwarding"
)]
pub response_forwarding: Option<MiddlewareErrorsServiceResponseForwarding>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scheme: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "serversTransport")]
pub servers_transport: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sticky: Option<MiddlewareErrorsServiceSticky>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub strategy: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub weight: Option<i64>,
}
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)]
pub enum MiddlewareErrorsServiceKind {
Service,
TraefikService,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareErrorsServiceResponseForwarding {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "flushInterval")]
pub flush_interval: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareErrorsServiceSticky {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cookie: Option<MiddlewareErrorsServiceStickyCookie>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareErrorsServiceStickyCookie {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "httpOnly")]
pub http_only: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "sameSite")]
pub same_site: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub secure: Option<bool>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareForwardAuth {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "authRequestHeaders"
)]
pub auth_request_headers: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "authResponseHeaders"
)]
pub auth_response_headers: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "authResponseHeadersRegex"
)]
pub auth_response_headers_regex: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tls: Option<MiddlewareForwardAuthTls>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "trustForwardHeader"
)]
pub trust_forward_header: Option<bool>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareForwardAuthTls {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "caSecret")]
pub ca_secret: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "certSecret")]
pub cert_secret: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "insecureSkipVerify"
)]
pub insecure_skip_verify: Option<bool>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareGrpcWeb {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "allowOrigins")]
pub allow_origins: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareHeaders {
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "accessControlAllowCredentials"
)]
pub access_control_allow_credentials: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "accessControlAllowHeaders"
)]
pub access_control_allow_headers: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "accessControlAllowMethods"
)]
pub access_control_allow_methods: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "accessControlAllowOriginList"
)]
pub access_control_allow_origin_list: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "accessControlAllowOriginListRegex"
)]
pub access_control_allow_origin_list_regex: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "accessControlExposeHeaders"
)]
pub access_control_expose_headers: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "accessControlMaxAge"
)]
pub access_control_max_age: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "addVaryHeader")]
pub add_vary_header: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "allowedHosts")]
pub allowed_hosts: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "browserXssFilter")]
pub browser_xss_filter: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "contentSecurityPolicy"
)]
pub content_security_policy: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "contentTypeNosniff"
)]
pub content_type_nosniff: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "customBrowserXSSValue"
)]
pub custom_browser_xss_value: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "customFrameOptionsValue"
)]
pub custom_frame_options_value: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "customRequestHeaders"
)]
pub custom_request_headers: Option<BTreeMap<String, String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "customResponseHeaders"
)]
pub custom_response_headers: Option<BTreeMap<String, String>>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "forceSTSHeader")]
pub force_sts_header: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "frameDeny")]
pub frame_deny: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "hostsProxyHeaders"
)]
pub hosts_proxy_headers: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "isDevelopment")]
pub is_development: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "permissionsPolicy"
)]
pub permissions_policy: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "publicKey")]
pub public_key: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "referrerPolicy")]
pub referrer_policy: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "sslProxyHeaders")]
pub ssl_proxy_headers: Option<BTreeMap<String, String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "stsIncludeSubdomains"
)]
pub sts_include_subdomains: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "stsPreload")]
pub sts_preload: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "stsSeconds")]
pub sts_seconds: Option<i64>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareInFlightReq {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub amount: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "sourceCriterion")]
pub source_criterion: Option<MiddlewareInFlightReqSourceCriterion>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareInFlightReqSourceCriterion {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "ipStrategy")]
pub ip_strategy: Option<MiddlewareInFlightReqSourceCriterionIpStrategy>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "requestHeaderName"
)]
pub request_header_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "requestHost")]
pub request_host: Option<bool>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareInFlightReqSourceCriterionIpStrategy {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub depth: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "excludedIPs")]
pub excluded_i_ps: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareIpAllowList {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "ipStrategy")]
pub ip_strategy: Option<MiddlewareIpAllowListIpStrategy>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "sourceRange")]
pub source_range: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareIpAllowListIpStrategy {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub depth: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "excludedIPs")]
pub excluded_i_ps: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewarePassTLSClientCert {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub info: Option<MiddlewarePassTLSClientCertInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pem: Option<bool>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewarePassTLSClientCertInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issuer: Option<MiddlewarePassTLSClientCertInfoIssuer>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "notAfter")]
pub not_after: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "notBefore")]
pub not_before: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sans: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "serialNumber")]
pub serial_number: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub subject: Option<MiddlewarePassTLSClientCertInfoSubject>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewarePassTLSClientCertInfoIssuer {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "commonName")]
pub common_name: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub country: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "domainComponent")]
pub domain_component: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub locality: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub organization: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub province: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "serialNumber")]
pub serial_number: Option<bool>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewarePassTLSClientCertInfoSubject {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "commonName")]
pub common_name: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub country: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "domainComponent")]
pub domain_component: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub locality: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub organization: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "organizationalUnit"
)]
pub organizational_unit: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub province: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "serialNumber")]
pub serial_number: Option<bool>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareRateLimit {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub average: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub burst: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub period: Option<IntOrString>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "sourceCriterion")]
pub source_criterion: Option<MiddlewareRateLimitSourceCriterion>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareRateLimitSourceCriterion {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "ipStrategy")]
pub ip_strategy: Option<MiddlewareRateLimitSourceCriterionIpStrategy>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "requestHeaderName"
)]
pub request_header_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "requestHost")]
pub request_host: Option<bool>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareRateLimitSourceCriterionIpStrategy {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub depth: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "excludedIPs")]
pub excluded_i_ps: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareRedirectRegex {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub permanent: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub regex: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub replacement: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareRedirectScheme {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub permanent: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub port: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scheme: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareReplacePath {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareReplacePathRegex {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub regex: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub replacement: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareRetry {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub attempts: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "initialInterval")]
pub initial_interval: Option<IntOrString>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareStripPrefix {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prefixes: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, JsonSchema)]
pub struct MiddlewareStripPrefixRegex {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub regex: Option<Vec<String>>,
}