predawn 0.9.0

Predawn is a Rust web framework like Spring Boot.
Documentation
use rudi::Singleton;
use serde::{Deserialize, Serialize};

use super::{Config, ConfigPrefix};
use crate::normalized_path::NormalizedPath;

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default, deny_unknown_fields)]
pub struct OpenAPIConfig {
    #[serde(default = "default_json_path")]
    pub json_path: NormalizedPath,
    #[serde(default = "default_swagger_ui_path")]
    pub swagger_ui_path: NormalizedPath,
    #[serde(default = "default_rapidoc_path")]
    pub rapidoc_path: NormalizedPath,
    #[serde(default = "default_scalar_path")]
    pub scalar_path: NormalizedPath,
    #[serde(default = "default_redoc_path")]
    pub redoc_path: NormalizedPath,
    #[serde(default = "default_openapi_explorer_path")]
    pub openapi_explorer_path: NormalizedPath,
}

#[Singleton]
impl OpenAPIConfig {
    #[di]
    pub fn new(#[di(ref)] config: &Config) -> Self {
        config.get().expect("failed to load `OpenAPIConfig`")
    }
}

fn default_json_path() -> NormalizedPath {
    "/openapi.json".into()
}

fn default_swagger_ui_path() -> NormalizedPath {
    "/swagger-ui".into()
}

fn default_rapidoc_path() -> NormalizedPath {
    "/rapidoc".into()
}

fn default_scalar_path() -> NormalizedPath {
    "/scalar".into()
}

fn default_redoc_path() -> NormalizedPath {
    "/redoc".into()
}

fn default_openapi_explorer_path() -> NormalizedPath {
    "/openapi-explorer".into()
}

impl Default for OpenAPIConfig {
    fn default() -> Self {
        Self {
            json_path: default_json_path(),
            swagger_ui_path: default_swagger_ui_path(),
            rapidoc_path: default_rapidoc_path(),
            scalar_path: default_scalar_path(),
            redoc_path: default_redoc_path(),
            openapi_explorer_path: default_openapi_explorer_path(),
        }
    }
}

impl ConfigPrefix for OpenAPIConfig {
    const PREFIX: &'static str = "openapi";
}