use serde::{Deserialize, Serialize};
fn default_require_auth_by_default() -> bool {
true
}
fn default_body_limit_bytes() -> usize {
16 * 1024 * 1024
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
#[serde(deny_unknown_fields)]
#[allow(clippy::struct_excessive_bools)]
pub struct ApiGatewayConfig {
pub bind_addr: String,
#[serde(default)]
pub enable_docs: bool,
#[serde(default)]
pub cors_enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub cors: Option<CorsConfig>,
#[serde(default)]
pub openapi: OpenApiConfig,
#[serde(default)]
pub defaults: Defaults,
#[serde(default)]
pub auth_disabled: bool,
#[serde(default = "default_require_auth_by_default")]
pub require_auth_by_default: bool,
#[serde(default)]
pub prefix_path: String,
#[serde(default)]
pub route_policies: RoutePoliciesConfig,
#[serde(default)]
pub metrics: MetricsConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(deny_unknown_fields, default)]
pub struct Defaults {
pub rate_limit: RateLimitDefaults,
pub body_limit_bytes: usize,
}
impl Default for Defaults {
fn default() -> Self {
Self {
rate_limit: RateLimitDefaults::default(),
body_limit_bytes: default_body_limit_bytes(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(deny_unknown_fields, default)]
pub struct RateLimitDefaults {
pub rps: u32,
pub burst: u32,
pub in_flight: u32,
}
impl Default for RateLimitDefaults {
fn default() -> Self {
Self {
rps: 50,
burst: 100,
in_flight: 64,
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(deny_unknown_fields, default)]
pub struct CorsConfig {
pub allowed_origins: Vec<String>,
pub allowed_methods: Vec<String>,
pub allowed_headers: Vec<String>,
pub allow_credentials: bool,
pub max_age_seconds: u64,
}
impl Default for CorsConfig {
fn default() -> Self {
Self {
allowed_origins: vec!["*".to_owned()],
allowed_methods: vec![
"GET".to_owned(),
"POST".to_owned(),
"PUT".to_owned(),
"PATCH".to_owned(),
"DELETE".to_owned(),
"OPTIONS".to_owned(),
],
allowed_headers: vec!["*".to_owned()],
allow_credentials: false,
max_age_seconds: 600,
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
#[serde(deny_unknown_fields, default)]
pub struct MetricsConfig {
pub prefix: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(deny_unknown_fields, default)]
pub struct OpenApiConfig {
pub title: String,
pub version: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
impl Default for OpenApiConfig {
fn default() -> Self {
Self {
title: "API Documentation".to_owned(),
version: "0.1.0".to_owned(),
description: None,
}
}
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(deny_unknown_fields, default)]
pub struct RoutePoliciesConfig {
pub enabled: bool,
pub rules: Vec<RoutePolicyRule>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct RoutePolicyRule {
pub path: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub method: Option<String>,
pub required_scopes: Vec<String>,
}