use serde::{de, Deserialize};
#[derive(Clone, Debug)]
pub enum MetaFormat {
Shell,
Json,
}
#[derive(Clone, Debug)]
pub struct MetaOpts {
pub format: MetaFormat,
}
impl Default for MetaOpts {
fn default() -> Self {
MetaOpts {
format: MetaFormat::Shell,
}
}
}
#[derive(Clone, Debug, Deserialize)]
#[serde(default)]
pub struct TocOpts {
#[serde(rename = "dmos_toc", deserialize_with = "deserialize_bool")]
pub render: bool,
#[serde(rename = "dmos_toc_skip_title", deserialize_with = "deserialize_bool")]
pub skip_title: bool,
#[serde(rename = "dmos_toc_prologue")]
pub prologue: String,
#[serde(rename = "dmos_toc_epilogue")]
pub epilogue: String,
}
impl Default for TocOpts {
fn default() -> Self {
TocOpts {
render: false,
skip_title: false,
prologue: "<section class=\"toc\"><h3>Table of Contents</h3>".to_string(),
epilogue: "</section>".to_string(),
}
}
}
#[derive(Clone, Debug, Default, Deserialize)]
#[serde(default)]
pub struct RenderOpts {
#[serde(rename = "dmos_anchor")]
pub anchor: Option<String>,
#[serde(rename = "dmos_no_emojis", deserialize_with = "deserialize_bool")]
pub no_emojis: bool,
#[serde(rename = "dmos_symbols")]
pub symbols: Option<String>,
#[serde(rename = "dmos_skip_title", deserialize_with = "deserialize_bool")]
pub skip_title: bool,
#[serde(flatten)]
pub toc: TocOpts,
}
fn deserialize_bool<'de, D>(deserializer: D) -> Result<bool, D::Error>
where
D: de::Deserializer<'de>,
{
let s: String = de::Deserialize::deserialize(deserializer)?;
match s.as_str() {
"true" => Ok(true),
"false" => Ok(false),
_ => Err(de::Error::unknown_variant(s.as_str(), &["true", "false"])),
}
}