use serde::{Deserialize, Serialize};
#[derive(Clone)]
pub struct SecuritySchemeEntry {
pub name: String,
pub scheme: utoipa::openapi::security::SecurityScheme,
pub scopes: Vec<(String, String)>,
}
impl std::fmt::Debug for SecuritySchemeEntry {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SecuritySchemeEntry")
.field("name", &self.name)
.field("scopes", &self.scopes)
.finish_non_exhaustive()
}
}
#[deprecated(
since = "0.1.0-rc.16",
note = "use `OpenApiSettings` from `reinhardt_conf::settings::openapi` instead"
)]
#[non_exhaustive]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpenApiConfig {
#[serde(default = "default_true")]
pub enabled: bool,
#[serde(default = "default_json_path")]
pub json_path: String,
#[serde(default = "default_swagger_path")]
pub swagger_path: String,
#[serde(default = "default_redoc_path")]
pub redoc_path: String,
#[serde(default = "default_title")]
pub title: String,
#[serde(default = "default_version")]
pub version: String,
#[serde(default)]
pub description: Option<String>,
#[serde(skip)]
pub security_schemes: Vec<SecuritySchemeEntry>,
}
#[allow(deprecated)] impl Default for OpenApiConfig {
fn default() -> Self {
Self {
enabled: true,
json_path: "/api/openapi.json".to_string(),
swagger_path: "/api/docs".to_string(),
redoc_path: "/api/redoc".to_string(),
title: "API Documentation".to_string(),
version: "1.0.0".to_string(),
description: None,
security_schemes: Vec::new(),
}
}
}
fn default_true() -> bool {
true
}
fn default_json_path() -> String {
"/api/openapi.json".to_string()
}
fn default_swagger_path() -> String {
"/api/docs".to_string()
}
fn default_redoc_path() -> String {
"/api/redoc".to_string()
}
fn default_title() -> String {
"API Documentation".to_string()
}
fn default_version() -> String {
"1.0.0".to_string()
}
#[cfg(test)]
#[allow(deprecated)] mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = OpenApiConfig::default();
assert!(config.enabled);
assert_eq!(config.json_path, "/api/openapi.json");
assert_eq!(config.swagger_path, "/api/docs");
assert_eq!(config.redoc_path, "/api/redoc");
assert_eq!(config.title, "API Documentation");
assert_eq!(config.version, "1.0.0");
assert_eq!(config.description, None);
}
#[test]
fn test_custom_config() {
let config = OpenApiConfig {
title: "My API".to_string(),
version: "2.0.0".to_string(),
description: Some("Custom API".to_string()),
..Default::default()
};
assert_eq!(config.title, "My API");
assert_eq!(config.version, "2.0.0");
assert_eq!(config.description, Some("Custom API".to_string()));
}
#[test]
fn test_serde_serialization() {
let config = OpenApiConfig::default();
let json = serde_json::to_string(&config).unwrap();
let deserialized: OpenApiConfig = serde_json::from_str(&json).unwrap();
assert_eq!(config.enabled, deserialized.enabled);
assert_eq!(config.json_path, deserialized.json_path);
}
#[test]
fn test_serde_with_missing_fields() {
let json = r#"{"title":"Test API"}"#;
let config: OpenApiConfig = serde_json::from_str(json).unwrap();
assert_eq!(config.title, "Test API");
assert_eq!(config.version, "1.0.0"); assert!(config.enabled); }
}