use std::path::Path; use std::collections::BTreeMap; use serde_json; use handlebars::{Handlebars, Helper, HelperDef, RenderContext, RenderError}; use pulldown_cmark::{html, Event, Parser, Tag}; // Handlebars helper to construct TOC #[derive(Clone, Copy)] pub struct RenderToc; impl HelperDef for RenderToc { fn call(&self, _h: &Helper, _: &Handlebars, rc: &mut RenderContext) -> Result<(), RenderError> { // get value from context data // rc.get_path() is current json parent path, you should always use it like this // param is the key of value you want to display let chapters = rc.evaluate_absolute("chapters").and_then(|c| { serde_json::value::from_value::>>(c.clone()) .map_err(|_| RenderError::new("Could not decode the JSON data")) })?; let current = rc.evaluate_absolute("path")? .as_str() .ok_or_else(|| RenderError::new("Type error for `path`, string expected"))? .replace("\"", ""); rc.writer.write_all(b"")?; rc.writer.write_all(b"")?; current_level -= 1; } rc.writer.write_all(b"")?; Ok(()) } }