use std::fs::File;
use anyhow::{anyhow, Context as _};
use once_cell::sync::Lazy;
mod config;
pub use config::Config;
#[derive(Default)]
pub struct Renderer {
logfile: Option<File>,
}
impl Renderer {
pub fn new() -> Self {
Self { logfile: None }
}
const NAME: &'static str = "typstpdf";
const CONFIG_KEY: &'static str = "output.typstpdf";
}
impl mdbook_renderer::Renderer for Renderer {
fn name(&self) -> &str {
Self::NAME
}
fn render(&self, ctx: &mdbook_renderer::RenderContext) -> anyhow::Result<()> {
if self.logfile.is_none() {
log::info!("no logfile");
}
static MDBOOK_VERSION_REQ: Lazy<semver::VersionReq> = Lazy::new(|| {
let compiled_mdbook_version = semver::Version::parse(mdbook_renderer::MDBOOK_VERSION).unwrap();
semver::VersionReq {
comparators: vec![semver::Comparator {
op: semver::Op::Caret,
major: compiled_mdbook_version.major,
minor: Some(compiled_mdbook_version.minor),
patch: None,
pre: Default::default(),
}],
}
});
let mdbook_server_version = semver::Version::parse(&ctx.version).unwrap();
if !MDBOOK_VERSION_REQ.matches(&mdbook_server_version) {
log::warn!(
"{} is semver-incompatible with mdbook {} (requires {})",
env!("CARGO_PKG_NAME"),
mdbook_server_version,
*MDBOOK_VERSION_REQ,
);
}
let cfg: Config = ctx
.config
.get(Self::CONFIG_KEY)
.with_context(|| format!("Unable to deserialize {}", Self::CONFIG_KEY))?
.ok_or(anyhow!("No {} table found", Self::CONFIG_KEY))?;
log::info!("cfg: {:?}", cfg);
cfg.renderer(ctx)
}
}