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