diff --git a/src/wasm/ast_node.rs b/src/wasm/ast_node.rs index 8545b42..5dd7196 100644 --- a/src/wasm/ast_node.rs +++ b/src/wasm/ast_node.rs @@ -1,3 +1,5 @@ +use std::borrow::Cow; + use serde::Serialize; use super::angle_link::WasmAngleLink; @@ -58,6 +60,34 @@ use super::timestamp::WasmTimestamp; use super::underline::WasmUnderline; use super::verbatim::WasmVerbatim; use super::verse_block::WasmVerseBlock; +use super::WasmStandardProperties; + +#[derive(Debug, Serialize)] +pub(crate) struct WasmAstWrapper<'b, 's, 'p, I> { + #[serde(rename = "ast-node")] + pub(crate) ast_node: Cow<'s, str>, + #[serde(rename = "standard-properties")] + pub(crate) standard_properties: &'b WasmStandardProperties, + #[serde(rename = "properties")] + pub(crate) inner: I, + pub(crate) children: &'b Vec>, +} + +impl<'b, 's, 'p, I> WasmAstWrapper<'b, 's, 'p, I> { + pub(crate) fn new( + ast_node: Cow<'s, str>, + standard_properties: &'b WasmStandardProperties, + inner: I, + children: &'b Vec>, + ) -> WasmAstWrapper<'b, 's, 'p, I> { + WasmAstWrapper { + ast_node, + standard_properties, + inner, + children, + } + } +} #[derive(Debug, Serialize)] #[serde(untagged)] diff --git a/src/wasm/document.rs b/src/wasm/document.rs index 9e812c7..e7a006f 100644 --- a/src/wasm/document.rs +++ b/src/wasm/document.rs @@ -5,6 +5,7 @@ use serde::Serialize; use super::additional_property::AdditionalProperties; use super::additional_property::AdditionalPropertyValue; use super::ast_node::WasmAstNode; +use super::ast_node::WasmAstWrapper; use super::macros::to_wasm; use super::standard_properties::WasmStandardProperties; use super::to_wasm::ToWasm; @@ -14,7 +15,7 @@ use crate::types::Document; use crate::wasm::to_wasm::ToWasmStandardProperties; #[derive(Debug, Serialize)] -#[serde(tag = "__ast_node")] +#[serde(tag = "ast_node")] #[serde(rename = "org-data")] pub struct WasmDocument<'s, 'p> { #[serde(rename = "standard-properties")] @@ -85,3 +86,16 @@ impl<'s, 'p> ElispFact<'s> for WasmDocument<'s, 'p> { "org-data".into() } } + +impl<'b, 's, 'p> Into>> + for &'b WasmDocument<'s, 'p> +{ + fn into(self) -> WasmAstWrapper<'b, 's, 'p, &'b WasmDocument<'s, 'p>> { + WasmAstWrapper::new( + self.get_elisp_name(), + &self.standard_properties, + self, + &self.children, + ) + } +} diff --git a/src/wasm_test/compare.rs b/src/wasm_test/compare.rs index a5033fd..a7f62b8 100644 --- a/src/wasm_test/compare.rs +++ b/src/wasm_test/compare.rs @@ -87,7 +87,7 @@ fn compare_json_value<'b, 's>( emacs: &'b Token<'s>, ) -> Result, Box> { match (value, emacs) { - (serde_json::Value::Object(wasm), Token::List(el)) if wasm.contains_key("__ast_node") => { + (serde_json::Value::Object(wasm), Token::List(el)) if wasm.contains_key("ast_node") => { // We hit a regular ast node. compare_ast_node(source, el, wasm) } @@ -133,7 +133,7 @@ fn compare_ast_node<'b, 's, 'p>( .ok_or("Should have a name as the first child.")? .as_atom()?; let wasm_name = wasm - .get("__ast_node") + .get("ast_node") .ok_or("Should have a ast node type.")? .as_str() .ok_or("Ast node type should be a string.")?;