use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ScalarConfig {
pub theme: ScalarTheme,
pub dark_mode: bool,
pub hide_search: bool,
pub hide_dark_mode_toggle: bool,
pub show_sidebar: bool,
pub layout: ScalarLayout,
pub hide_models: bool,
pub hide_client_button: bool,
#[serde(rename = "documentDownloadType")]
pub document_download: DocumentDownload,
pub show_developer_tools: DeveloperTools,
#[serde(serialize_with = "serialize_agent", rename = "agent")]
pub agent_enabled: bool,
#[serde(serialize_with = "serialize_mcp", rename = "mcp")]
pub mcp_enabled: bool,
#[serde(skip_serializing)]
pub cdn_url: Option<String>,
}
impl Default for ScalarConfig {
fn default() -> Self {
Self {
theme: ScalarTheme::Default,
layout: ScalarLayout::Modern,
dark_mode: true,
hide_dark_mode_toggle: false,
hide_search: false,
show_sidebar: true,
hide_models: true,
hide_client_button: true,
document_download: DocumentDownload::None,
show_developer_tools: DeveloperTools::Never,
agent_enabled: false,
mcp_enabled: false,
cdn_url: None,
}
}
}
impl ScalarConfig {
pub fn theme(mut self, theme: ScalarTheme) -> Self {
self.theme = theme;
self
}
pub fn layout(mut self, layout: ScalarLayout) -> Self {
self.layout = layout;
self
}
pub fn dark_mode(mut self, on: bool) -> Self {
self.dark_mode = on;
self
}
pub fn hide_dark_mode_toggle(mut self, hide: bool) -> Self {
self.hide_dark_mode_toggle = hide;
self
}
pub fn hide_search(mut self, hide: bool) -> Self {
self.hide_search = hide;
self
}
pub fn show_sidebar(mut self, show: bool) -> Self {
self.show_sidebar = show;
self
}
pub fn hide_models(mut self, hide: bool) -> Self {
self.hide_models = hide;
self
}
pub fn hide_client_button(mut self, hide: bool) -> Self {
self.hide_client_button = hide;
self
}
pub fn document_download(mut self, format: DocumentDownload) -> Self {
self.document_download = format;
self
}
pub fn show_developer_tools(mut self, when: DeveloperTools) -> Self {
self.show_developer_tools = when;
self
}
pub fn agent_enabled(mut self, on: bool) -> Self {
self.agent_enabled = on;
self
}
pub fn mcp_enabled(mut self, on: bool) -> Self {
self.mcp_enabled = on;
self
}
pub fn cdn_url(mut self, url: impl Into<String>) -> Self {
self.cdn_url = Some(url.into());
self
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum ScalarTheme {
Default,
Alternate,
Moon,
Purple,
Solarized,
BluePlanet,
Saturn,
Kepler,
Mars,
DeepSpace,
None,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum ScalarLayout {
Modern,
Classic,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum DocumentDownload {
None,
Json,
Yaml,
Both,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum DeveloperTools {
Never,
Always,
OnHover,
}
fn serialize_agent<S: serde::Serializer>(enabled: &bool, ser: S) -> Result<S::Ok, S::Error> {
serialize_disabled_object(*enabled, ser)
}
fn serialize_mcp<S: serde::Serializer>(enabled: &bool, ser: S) -> Result<S::Ok, S::Error> {
serialize_disabled_object(*enabled, ser)
}
fn serialize_disabled_object<S: serde::Serializer>(
enabled: bool,
ser: S,
) -> Result<S::Ok, S::Error> {
use serde::ser::SerializeMap;
let mut map = ser.serialize_map(Some(1))?;
map.serialize_entry("disabled", &!enabled)?;
map.end()
}