use rust_embed::RustEmbed;
use serde::{Deserialize, Serialize};
#[derive(RustEmbed)]
#[folder = "./dist/"]
pub struct Assets;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct UrlObject {
pub name: String,
pub url: String,
}
impl UrlObject {
pub fn new(name: &str, url: &str) -> Self {
Self {
name: name.to_string(),
url: url.to_string(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum DefaultModelRendering {
Example,
Model,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum DocExpansion {
List,
Full,
None,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Filter {
Bool(bool),
Str(String),
}
pub struct Spec {
pub name: String,
pub content: &'static [u8]
}
#[macro_export]
macro_rules! swagger_spec_file {
($name: literal) => {
swagger_ui::Spec {
name: $name.to_string(),
content: include_bytes!($name)
}
};
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Config {
#[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,
}
fn is_zero(num: &u32) -> bool {
*num == 0
}
impl Default for Config {
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,
}
}
}
#[cfg(test)]
mod tests {
use std::path::Path;
use crate::Assets;
fn asset_list() -> [&'static str; 8] {
[
"favicon-16x16.png",
"favicon-32x32.png",
"index.html",
"oauth2-redirect.html",
"swagger-ui.css",
"swagger-ui.js",
"swagger-ui-bundle.js",
"swagger-ui-standalone-preset.js",
]
}
#[test]
fn swagger_ui_dist_exists() {
println!("Checking if assets exists");
for file in &asset_list() {
let asset = format!("dist/{}", file);
println!("\t{}", asset);
assert!(Path::new(&asset).exists());
}
}
#[test]
fn swagger_ui_assets() {
println!("Checking if assets exists in binary");
for asset in &asset_list() {
println!("\t{}", asset);
let data = Assets::get(&asset).unwrap();
assert!(!data.is_empty());
}
}
}