blob: 2a9ed2058b9846c4227d71bb28f07b48563a2607 [file] [log] [blame]
//! Get any `preprocessor.trpl-*` config.
use mdbook::preprocess::PreprocessorContext;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Mode {
Default,
Simple,
}
impl Mode {
pub fn from_context(
ctx: &PreprocessorContext,
preprocessor_name: &str,
) -> Result<Mode, Error> {
let config = ctx
.config
.get_preprocessor(preprocessor_name)
.ok_or_else(|| Error::NoConfig(preprocessor_name.into()))?;
let key = String::from("output-mode");
let mode = config
.get(&key)
.map(|value| match value.as_str() {
Some(s) => Mode::try_from(s).map_err(|_| Error::BadValue {
key,
value: value.to_string(),
}),
None => Err(Error::BadValue {
key,
value: value.to_string(),
}),
})
.transpose()?
.unwrap_or(Mode::Default);
Ok(mode)
}
}
/// Trivial marker struct to indicate an internal error.
///
/// The caller has enough info to do what it needs without passing data around.
pub struct ParseErr;
impl TryFrom<&str> for Mode {
type Error = ParseErr;
fn try_from(value: &str) -> Result<Self, Self::Error> {
match value {
"default" => Ok(Mode::Default),
"simple" => Ok(Mode::Simple),
_ => Err(ParseErr),
}
}
}
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error(transparent)]
Mdbook(#[from] mdbook::errors::Error),
#[error("No config for '{0}'")]
NoConfig(String),
#[error("Bad config value '{value}' for key '{key}'")]
BadValue { key: String, value: String },
}
#[cfg(test)]
mod tests;