use super::macros::to_wasm; use super::WasmAstNode; use crate::error::CustomError; use crate::types::DocumentElement; use crate::types::Element; use crate::types::Object; pub trait ToWasm { type Output; fn to_wasm(&self, full_document: ToWasmContext<'_>) -> Result; } pub(crate) trait ToWasmStandardProperties { type Output; fn to_wasm_standard_properties( &self, wasm_context: ToWasmContext<'_>, ) -> Result; } #[derive(Debug, Clone)] pub struct ToWasmContext<'s> { pub(crate) full_document: &'s str, } impl<'s> ToWasmContext<'s> { pub fn new(full_document: &'s str) -> ToWasmContext<'s> { ToWasmContext { full_document } } } to_wasm!(WasmAstNode, DocumentElement<'s>, original, wasm_context, { match original { DocumentElement::Heading(inner) => { inner.to_wasm(wasm_context).map(Into::::into) } DocumentElement::Section(inner) => { inner.to_wasm(wasm_context).map(Into::::into) } } }); to_wasm!(WasmAstNode, Element<'s>, original, wasm_context, { match original { Element::Paragraph(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::PlainList(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::CenterBlock(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::QuoteBlock(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::SpecialBlock(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::DynamicBlock(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::FootnoteDefinition(inner) => { inner.to_wasm(wasm_context).map(Into::::into) } Element::Comment(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::Drawer(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::PropertyDrawer(inner) => { inner.to_wasm(wasm_context).map(Into::::into) } Element::Table(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::VerseBlock(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::CommentBlock(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::ExampleBlock(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::ExportBlock(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::SrcBlock(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::Clock(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::DiarySexp(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::Planning(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::FixedWidthArea(inner) => { inner.to_wasm(wasm_context).map(Into::::into) } Element::HorizontalRule(inner) => { inner.to_wasm(wasm_context).map(Into::::into) } Element::Keyword(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::BabelCall(inner) => inner.to_wasm(wasm_context).map(Into::::into), Element::LatexEnvironment(inner) => { inner.to_wasm(wasm_context).map(Into::::into) } } }); to_wasm!(WasmAstNode, Object<'s>, original, wasm_context, { match original { Object::Bold(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::Italic(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::Underline(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::StrikeThrough(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::Code(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::Verbatim(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::PlainText(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::RegularLink(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::RadioLink(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::RadioTarget(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::PlainLink(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::AngleLink(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::OrgMacro(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::Entity(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::LatexFragment(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::ExportSnippet(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::FootnoteReference(inner) => { inner.to_wasm(wasm_context).map(Into::::into) } Object::Citation(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::CitationReference(inner) => { inner.to_wasm(wasm_context).map(Into::::into) } Object::InlineBabelCall(inner) => { inner.to_wasm(wasm_context).map(Into::::into) } Object::InlineSourceBlock(inner) => { inner.to_wasm(wasm_context).map(Into::::into) } Object::LineBreak(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::Target(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::StatisticsCookie(inner) => { inner.to_wasm(wasm_context).map(Into::::into) } Object::Subscript(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::Superscript(inner) => inner.to_wasm(wasm_context).map(Into::::into), Object::Timestamp(inner) => inner.to_wasm(wasm_context).map(Into::::into), } });