use std::borrow::Cow;
use serde::Serialize;
use super::oauth;
use crate::swagger_ui::Url;
const SWAGGER_STANDALONE_LAYOUT: &str = "StandaloneLayout";
const SWAGGER_BASE_LAYOUT: &str = "BaseLayout";
#[non_exhaustive]
#[derive(Serialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct Config<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) config_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "dom_id")]
pub(crate) dom_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "urls.primaryName")]
pub(crate) urls_primary_name: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub(crate) urls: Vec<Url<'a>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) query_config_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) deep_linking: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) display_operation_id: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) default_models_expand_depth: Option<isize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) default_model_expand_depth: Option<isize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) default_model_rendering: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) display_request_duration: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) doc_expansion: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) filter: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) max_displayed_tags: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) show_extensions: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) show_common_extensions: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) try_it_out_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) request_snippets_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) oauth2_redirect_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) show_mutated_request: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) supported_submit_methods: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) validator_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) with_credentials: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) persist_authorization: Option<bool>,
#[serde(skip)]
pub(crate) oauth: Option<oauth::Config>,
pub(crate) layout: &'a str,
}
impl<'a> Config<'a> {
fn new_<I: IntoIterator<Item = U>, U: Into<Url<'a>>>(urls: I, oauth_config: Option<oauth::Config>) -> Self {
let urls = urls.into_iter().map(Into::into).collect::<Vec<Url<'a>>>();
let urls_len = urls.len();
Self {
oauth: oauth_config,
..if urls_len == 1 {
Self::new_config_with_single_url(urls)
} else {
Self::new_config_with_multiple_urls(urls)
}
}
}
fn new_config_with_multiple_urls(urls: Vec<Url<'a>>) -> Self {
let primary_name = urls
.iter()
.find(|url| url.primary)
.map(|url| url.name.as_ref().to_owned());
Self {
urls_primary_name: primary_name,
urls: urls
.into_iter()
.map(|mut url| {
if url.name.is_empty() {
url.name = Cow::Owned(String::from(&url.url[..]));
url
} else {
url
}
})
.collect(),
..Default::default()
}
}
fn new_config_with_single_url(mut urls: Vec<Url<'a>>) -> Self {
let url = urls.get_mut(0).map(std::mem::take).expect("urls should not be empty");
let primary_name = if url.primary {
Some(url.name.as_ref().to_owned())
} else {
None
};
Self {
urls_primary_name: primary_name,
url: if url.name.is_empty() {
Some(url.url.as_ref().to_owned())
} else {
None
},
urls: if !url.name.is_empty() { vec![url] } else { Vec::new() },
..Default::default()
}
}
pub fn new<I: IntoIterator<Item = U>, U: Into<Url<'a>>>(urls: I) -> Self {
Self::new_(urls, None)
}
pub fn with_oauth_config<I: IntoIterator<Item = U>, U: Into<Url<'a>>>(
urls: I,
oauth_config: oauth::Config,
) -> Self {
Self::new_(urls, Some(oauth_config))
}
#[must_use]
pub fn config_url<S: Into<String>>(mut self, config_url: S) -> Self {
self.config_url = Some(config_url.into());
self
}
#[must_use]
pub fn dom_id<S: Into<String>>(mut self, dom_id: S) -> Self {
self.dom_id = Some(dom_id.into());
self
}
#[must_use] pub fn query_config_enabled(mut self, query_config_enabled: bool) -> Self {
self.query_config_enabled = Some(query_config_enabled);
self
}
#[must_use] pub fn deep_linking(mut self, deep_linking: bool) -> Self {
self.deep_linking = Some(deep_linking);
self
}
#[must_use] pub fn display_operation_id(mut self, display_operation_id: bool) -> Self {
self.display_operation_id = Some(display_operation_id);
self
}
#[must_use] pub fn use_base_layout(mut self) -> Self {
self.layout = SWAGGER_BASE_LAYOUT;
self
}
#[must_use] pub fn default_models_expand_depth(mut self, default_models_expand_depth: isize) -> Self {
self.default_models_expand_depth = Some(default_models_expand_depth);
self
}
#[must_use] pub fn default_model_expand_depth(mut self, default_model_expand_depth: isize) -> Self {
self.default_model_expand_depth = Some(default_model_expand_depth);
self
}
#[must_use]
pub fn default_model_rendering<S: Into<String>>(mut self, default_model_rendering: S) -> Self {
self.default_model_rendering = Some(default_model_rendering.into());
self
}
#[must_use] pub fn display_request_duration(mut self, display_request_duration: bool) -> Self {
self.display_request_duration = Some(display_request_duration);
self
}
#[must_use]
pub fn doc_expansion<S: Into<String>>(mut self, doc_expansion: S) -> Self {
self.doc_expansion = Some(doc_expansion.into());
self
}
#[must_use] pub fn filter(mut self, filter: bool) -> Self {
self.filter = Some(filter);
self
}
#[must_use] pub fn max_displayed_tags(mut self, max_displayed_tags: usize) -> Self {
self.max_displayed_tags = Some(max_displayed_tags);
self
}
#[must_use] pub fn show_extensions(mut self, show_extensions: bool) -> Self {
self.show_extensions = Some(show_extensions);
self
}
#[must_use] pub fn show_common_extensions(mut self, show_common_extensions: bool) -> Self {
self.show_common_extensions = Some(show_common_extensions);
self
}
#[must_use] pub fn try_it_out_enabled(mut self, try_it_out_enabled: bool) -> Self {
self.try_it_out_enabled = Some(try_it_out_enabled);
self
}
#[must_use] pub fn request_snippets_enabled(mut self, request_snippets_enabled: bool) -> Self {
self.request_snippets_enabled = Some(request_snippets_enabled);
self
}
#[must_use]
pub fn oauth2_redirect_url<S: Into<String>>(mut self, oauth2_redirect_url: S) -> Self {
self.oauth2_redirect_url = Some(oauth2_redirect_url.into());
self
}
#[must_use] pub fn show_mutated_request(mut self, show_mutated_request: bool) -> Self {
self.show_mutated_request = Some(show_mutated_request);
self
}
#[must_use]
pub fn supported_submit_methods<I: IntoIterator<Item = S>, S: Into<String>>(
mut self,
supported_submit_methods: I,
) -> Self {
self.supported_submit_methods = Some(
supported_submit_methods
.into_iter()
.map(|method| method.into())
.collect(),
);
self
}
#[must_use]
pub fn validator_url<S: Into<String>>(mut self, validator_url: S) -> Self {
self.validator_url = Some(validator_url.into());
self
}
#[must_use] pub fn with_credentials(mut self, with_credentials: bool) -> Self {
self.with_credentials = Some(with_credentials);
self
}
#[must_use] pub fn persist_authorization(mut self, persist_authorization: bool) -> Self {
self.persist_authorization = Some(persist_authorization);
self
}
}
impl Default for Config<'_> {
fn default() -> Self {
Self {
config_url: Default::default(),
dom_id: Some("#swagger-ui".to_owned()),
url: Default::default(),
urls_primary_name: Default::default(),
urls: Default::default(),
query_config_enabled: Default::default(),
deep_linking: Some(true),
display_operation_id: Default::default(),
default_models_expand_depth: Default::default(),
default_model_expand_depth: Default::default(),
default_model_rendering: Default::default(),
display_request_duration: Default::default(),
doc_expansion: Default::default(),
filter: Default::default(),
max_displayed_tags: Default::default(),
show_extensions: Default::default(),
show_common_extensions: Default::default(),
try_it_out_enabled: Default::default(),
request_snippets_enabled: Default::default(),
oauth2_redirect_url: Default::default(),
show_mutated_request: Default::default(),
supported_submit_methods: Default::default(),
validator_url: Default::default(),
with_credentials: Default::default(),
persist_authorization: Default::default(),
oauth: Default::default(),
layout: SWAGGER_STANDALONE_LAYOUT,
}
}
}
impl<'a> From<&'a str> for Config<'a> {
fn from(s: &'a str) -> Self {
Self::new([s])
}
}
impl From<String> for Config<'_> {
fn from(s: String) -> Self {
Self::new([s])
}
}