use crate::handlers::{ContentHandler, RedirectHandler};
use crate::settings::UrlObject;
use rocket::http::ContentType;
use rocket::Route;
use serde::{Deserialize, Serialize};
macro_rules! static_file {
($name: literal, $type: ident) => {
ContentHandler::bytes(
ContentType::$type,
include_bytes!(concat!("../swagger-ui/", $name)),
)
.into_route(concat!("/", $name))
};
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum DefaultModelRendering {
Example,
Model,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum DocExpansion {
List,
Full,
None,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(untagged)]
pub enum Filter {
Bool(bool),
Str(String),
}
fn is_zero(num: &u32) -> bool {
*num == 0
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SwaggerUIConfig {
#[serde(default, skip_serializing_if = "String::is_empty")]
pub url: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub urls: Vec<UrlObject>,
pub deep_linking: bool,
pub display_operation_id: bool,
pub default_models_expand_depth: i32,
pub default_model_expand_depth: i32,
pub default_model_rendering: DefaultModelRendering,
pub display_request_duration: bool,
pub doc_expansion: DocExpansion,
pub filter: Filter,
#[serde(default, skip_serializing_if = "is_zero")]
pub max_displayed_tags: u32,
pub show_extensions: bool,
pub show_common_extensions: bool,
}
impl Default for SwaggerUIConfig {
fn default() -> Self {
Self {
url: String::new(),
urls: vec![],
deep_linking: false,
display_operation_id: false,
default_model_expand_depth: 1,
default_model_rendering: DefaultModelRendering::Example,
default_models_expand_depth: 1,
display_request_duration: false,
doc_expansion: DocExpansion::List,
filter: Filter::Bool(false),
max_displayed_tags: 0,
show_extensions: false,
show_common_extensions: false,
}
}
}
#[must_use]
pub fn make_swagger_ui(config: &SwaggerUIConfig) -> impl Into<Vec<Route>> {
let config_handler = ContentHandler::json(config);
vec![
RedirectHandler::to("index.html").into_route("/"),
config_handler.into_route("/swagger-ui-config.json"),
static_file!("index.html", HTML),
static_file!("index.css", CSS),
static_file!("oauth2-redirect.html", HTML),
static_file!("swagger-initializer.js", JavaScript),
static_file!("swagger-ui-standalone-preset.js", JavaScript),
static_file!("swagger-ui-bundle.js", JavaScript),
static_file!("swagger-ui.css", CSS),
]
}