use std::path::PathBuf;
use serde::{Deserialize, Serialize};
fn default_class_prefix() -> String {
"kb-".to_string()
}
fn default_true() -> bool {
true
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HtmlOutputConfig {
#[serde(default)]
pub css: Option<String>,
#[serde(default)]
pub css_file: Option<PathBuf>,
#[serde(default)]
pub theme: HtmlTheme,
#[serde(default = "default_class_prefix")]
pub class_prefix: String,
#[serde(default = "default_true")]
pub embed_css: bool,
}
impl Default for HtmlOutputConfig {
fn default() -> Self {
Self {
css: None,
css_file: None,
theme: HtmlTheme::Unstyled,
class_prefix: default_class_prefix(),
embed_css: true,
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum HtmlTheme {
Default,
GitHub,
Dark,
Light,
#[default]
Unstyled,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_config_values() {
let cfg = HtmlOutputConfig::default();
assert_eq!(cfg.class_prefix, "kb-");
assert!(cfg.embed_css);
assert!(cfg.css.is_none());
assert!(cfg.css_file.is_none());
assert_eq!(cfg.theme, HtmlTheme::Unstyled);
}
#[test]
fn serde_roundtrip() {
let cfg = HtmlOutputConfig {
css: Some(".kb-p { color: red; }".to_string()),
theme: HtmlTheme::GitHub,
embed_css: false,
..Default::default()
};
let json = serde_json::to_string(&cfg).unwrap();
let back: HtmlOutputConfig = serde_json::from_str(&json).unwrap();
assert_eq!(back.css, cfg.css);
assert_eq!(back.theme, HtmlTheme::GitHub);
assert!(!back.embed_css);
}
#[test]
fn theme_serde() {
assert_eq!(serde_json::to_string(&HtmlTheme::GitHub).unwrap(), "\"github\"");
let t: HtmlTheme = serde_json::from_str("\"dark\"").unwrap();
assert_eq!(t, HtmlTheme::Dark);
}
}