use serde::Serialize; use super::render_context::RenderContext; use crate::error::CustomError; use crate::intermediate::ISrcBlock; use crate::intermediate::ISrcSegment; use super::macros::render; #[derive(Debug, Serialize)] #[serde(tag = "type")] #[serde(rename = "src_block")] pub(crate) struct RenderSrcBlock { lines: Vec, language: Option, post_blank: organic::types::PostBlank, } #[derive(Debug, Serialize)] #[serde(tag = "type")] #[serde(rename = "src_block")] pub(crate) struct RenderSrcLine { children: Vec, } #[derive(Debug, Serialize)] pub(crate) enum RenderSrcSegment { #[serde(rename = "raw_text")] RawText(String), #[serde(rename = "highlight_start")] HighlightStart { name: String }, #[serde(rename = "highlight_end")] HighlightEnd, } render!(RenderSrcBlock, ISrcBlock, original, _render_context, { let lines = original .lines .iter() .map(|original_line| { let children = original_line .children .iter() .map(|original_segment| match original_segment { ISrcSegment::RawText(body) => RenderSrcSegment::RawText(body.to_owned()), ISrcSegment::HighlightStart { name } => RenderSrcSegment::HighlightStart { name: name.to_owned(), }, ISrcSegment::HighlightEnd => RenderSrcSegment::HighlightEnd, }) .collect(); RenderSrcLine { children } }) .collect(); Ok(RenderSrcBlock { lines, language: original.language.clone(), post_blank: original.post_blank, }) });