use crate::define_helper_with_prefix_and_postfix; use crate::renderer::BlockRenderFunctions; use handlebars::{ Context, Handlebars, Helper, HelperResult, Output, RenderContext, RenderError as HandlebarsRenderError, }; use serde_json::Value; use super::{table::Table, value_to_string}; fn render_html_table( h: &Helper, _: &Handlebars, _: &Context, _: &mut RenderContext, out: &mut dyn Output, ) -> HelperResult { let param = h .param(0) .ok_or_else(|| HandlebarsRenderError::new("parameter not found"))?; let value = param.value(); let table: Table = serde_json::from_value(value.clone())?; out.write("\n")?; // Write header out.write(" \n")?; for column in &table.schema.columns { out.write(" \n")?; } out.write(" \n")?; // Write individual rows for row in &table.data { out.write(" \n")?; for column in &table.schema.columns { let entry = row.get(&column.id).unwrap_or(&Value::Null); let text = if let Some(renderer) = &column.renderer { renderer.render(entry)? } else { value_to_string(entry) }; out.write(" \n")?; } out.write(" \n")?; } out.write("
")?; out.write(&handlebars::html_escape(&column.label))?; out.write("
")?; out.write(&handlebars::html_escape(&text))?; out.write("
\n")?; Ok(()) } fn render_object( h: &Helper, _: &Handlebars, _: &Context, _: &mut RenderContext, out: &mut dyn Output, ) -> HelperResult { let param = h .param(0) .ok_or_else(|| HandlebarsRenderError::new("parameter not found"))?; let value = param.value(); out.write("\n
")?;
    out.write(&serde_json::to_string_pretty(&value)?)?;
    out.write("\n
\n")?; Ok(()) } define_helper_with_prefix_and_postfix!(verbatim_monospaced, "
", "
"); define_helper_with_prefix_and_postfix!(heading_1, "

", "

"); define_helper_with_prefix_and_postfix!(heading_2, "

", "

"); define_helper_with_prefix_and_postfix!( verbatim, "
",
    "
" ); pub(super) fn block_render_functions() -> BlockRenderFunctions { BlockRenderFunctions { table: Box::new(render_html_table), verbatim_monospaced: Box::new(verbatim_monospaced), object: Box::new(render_object), heading_1: Box::new(heading_1), heading_2: Box::new(heading_2), verbatim: Box::new(verbatim), } }