From 20a7c89084ed895856f846b40e6a728a72b2df1a Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Wed, 27 Dec 2023 13:21:20 -0500 Subject: [PATCH] Improving WasmElispCompare. --- src/wasm/document.rs | 2 +- src/wasm_test/compare.rs | 146 ++++++++++++++++----------------- src/wasm_test/elisp_compare.rs | 2 +- 3 files changed, 73 insertions(+), 77 deletions(-) diff --git a/src/wasm/document.rs b/src/wasm/document.rs index ddcee77..0dfe086 100644 --- a/src/wasm/document.rs +++ b/src/wasm/document.rs @@ -15,7 +15,7 @@ use crate::wasm::to_wasm::ToWasmStandardProperties; pub struct WasmDocument<'s, 'p> { standard_properties: WasmStandardProperties, additional_properties: Vec<(String, &'s str)>, - children: Vec>, + pub(crate) children: Vec>, category: Option<&'p str>, path: Option, } diff --git a/src/wasm_test/compare.rs b/src/wasm_test/compare.rs index 1665206..c375f30 100644 --- a/src/wasm_test/compare.rs +++ b/src/wasm_test/compare.rs @@ -33,7 +33,7 @@ pub struct WasmDiffResult<'b, 's> { #[derive(Debug)] pub(crate) enum WasmDiffStatus { Good, - Bad, + Bad(Cow<'static, str>), } #[derive(Debug)] @@ -42,6 +42,29 @@ pub struct WasmDiffLayer<'b, 's> { children: Vec>, } +#[derive(Debug)] +pub struct WasmDiffList<'b, 's> { + status: WasmDiffStatus, + children: Vec>, +} + +impl<'b, 's> WasmDiffList<'b, 's> { + fn apply( + &self, + status: &mut WasmDiffStatus, + children: &mut Vec>, + ) -> Result, Box> { + todo!() + } + + fn extend( + &self, + other: &mut WasmDiffList<'b, 's>, + ) -> Result, Box> { + todo!() + } +} + impl<'b, 's> WasmDiffEntry<'b, 's> { // fn has_bad_children(&self) -> bool { // match self { @@ -85,92 +108,52 @@ impl<'b, 's> WasmDiffEntry<'b, 's> { } } -fn wasm_compare_ast_node<'b, 's, 'p>( - source: &'s str, - emacs: &'b Token<'s>, - wasm: WasmAstNode<'s, 'p>, -) -> Result, Box> { - match wasm { - WasmAstNode::Document(_) => todo!(), - WasmAstNode::Headline(_) => todo!(), - WasmAstNode::Section(_) => todo!(), - WasmAstNode::Paragraph(_) => todo!(), - WasmAstNode::PlainList(_) => todo!(), - WasmAstNode::PlainListItem(_) => todo!(), - WasmAstNode::CenterBlock(_) => todo!(), - WasmAstNode::QuoteBlock(_) => todo!(), - WasmAstNode::SpecialBlock(_) => todo!(), - WasmAstNode::DynamicBlock(_) => todo!(), - WasmAstNode::FootnoteDefinition(_) => todo!(), - WasmAstNode::Comment(_) => todo!(), - WasmAstNode::Drawer(_) => todo!(), - WasmAstNode::PropertyDrawer(_) => todo!(), - WasmAstNode::NodeProperty(_) => todo!(), - WasmAstNode::Table(_) => todo!(), - WasmAstNode::TableRow(_) => todo!(), - WasmAstNode::VerseBlock(_) => todo!(), - WasmAstNode::CommentBlock(_) => todo!(), - WasmAstNode::ExampleBlock(_) => todo!(), - WasmAstNode::ExportBlock(_) => todo!(), - WasmAstNode::SrcBlock(_) => todo!(), - WasmAstNode::Clock(_) => todo!(), - WasmAstNode::DiarySexp(_) => todo!(), - WasmAstNode::Planning(_) => todo!(), - WasmAstNode::FixedWidthArea(_) => todo!(), - WasmAstNode::HorizontalRule(_) => todo!(), - WasmAstNode::Keyword(_) => todo!(), - WasmAstNode::BabelCall(_) => todo!(), - WasmAstNode::LatexEnvironment(_) => todo!(), - WasmAstNode::Bold(_) => todo!(), - WasmAstNode::Italic(_) => todo!(), - WasmAstNode::Underline(_) => todo!(), - WasmAstNode::StrikeThrough(_) => todo!(), - WasmAstNode::Code(_) => todo!(), - WasmAstNode::Verbatim(_) => todo!(), - WasmAstNode::PlainText(_) => todo!(), - WasmAstNode::RegularLink(_) => todo!(), - WasmAstNode::RadioLink(_) => todo!(), - WasmAstNode::RadioTarget(_) => todo!(), - WasmAstNode::PlainLink(_) => todo!(), - WasmAstNode::AngleLink(_) => todo!(), - WasmAstNode::OrgMacro(_) => todo!(), - WasmAstNode::Entity(_) => todo!(), - WasmAstNode::LatexFragment(_) => todo!(), - WasmAstNode::ExportSnippet(_) => todo!(), - WasmAstNode::FootnoteReference(_) => todo!(), - WasmAstNode::Citation(_) => todo!(), - WasmAstNode::CitationReference(_) => todo!(), - WasmAstNode::InlineBabelCall(_) => todo!(), - WasmAstNode::InlineSourceBlock(_) => todo!(), - WasmAstNode::LineBreak(_) => todo!(), - WasmAstNode::Target(_) => todo!(), - WasmAstNode::StatisticsCookie(_) => todo!(), - WasmAstNode::Subscript(_) => todo!(), - WasmAstNode::Superscript(_) => todo!(), - WasmAstNode::TableCell(_) => todo!(), - WasmAstNode::Timestamp(_) => todo!(), - } - todo!() -} - fn wasm_compare_list<'b, 's, 'p, EI, WI, WC>( source: &'s str, emacs: EI, wasm: WI, -) -> Result, Box> +) -> Result, Box> where EI: Iterator> + ExactSizeIterator, WI: Iterator + ExactSizeIterator, WC: WasmElispCompare<'s, 'p>, { - // let mut this_status = WasmDiffStatus::Good; - // let mut child_status = Vec::new(); - // let mut message = None; + let emacs_length = emacs.len(); + let wasm_length = wasm.len(); + if emacs_length != wasm_length { + return Ok(WasmDiffList { + status: WasmDiffStatus::Bad( + format!( + "Child length mismatch (emacs != rust) {:?} != {:?}", + emacs_length, wasm_length + ) + .into(), + ), + children: Vec::new(), + }); + } - todo!() + let mut child_status = Vec::with_capacity(emacs_length); + for (emacs_child, wasm_child) in emacs.zip(wasm) { + child_status.push(wasm_child.compare_ast_node(source, emacs_child)?); + } + Ok(WasmDiffList { + status: WasmDiffStatus::Good, + children: child_status, + }) } -impl<'s, 'p> WasmElispCompare<'s, 'p> for WasmDocument<'s, 'p> { +impl<'s, 'p, WAN: WasmElispCompare<'s, 'p>> WasmElispCompare<'s, 'p> for &WAN { + fn compare_ast_node<'b>( + &self, + source: &'s str, + emacs: &'b Token<'s>, + ) -> Result, Box> { + (*self).compare_ast_node(source, emacs) + } +} + +impl<'s, 'p> WasmElispCompare<'s, 'p> for WasmAstNode<'s, 'p> { fn compare_ast_node<'b>( &self, source: &'s str, @@ -179,3 +162,16 @@ impl<'s, 'p> WasmElispCompare<'s, 'p> for WasmDocument<'s, 'p> { todo!() } } + +impl<'s, 'p> WasmElispCompare<'s, 'p> for WasmDocument<'s, 'p> { + fn compare_ast_node<'b>( + &self, + source: &'s str, + emacs: &'b Token<'s>, + ) -> Result, Box> { + let emacs_children = emacs.as_list()?.iter().skip(2); + let wasm_children = self.children.iter(); + let child_status = wasm_compare_list(source, emacs_children, wasm_children)?; + todo!() + } +} diff --git a/src/wasm_test/elisp_compare.rs b/src/wasm_test/elisp_compare.rs index bda867e..25de180 100644 --- a/src/wasm_test/elisp_compare.rs +++ b/src/wasm_test/elisp_compare.rs @@ -3,7 +3,7 @@ use crate::compare::Token; pub trait WasmElispCompare<'s, 'p> { fn compare_ast_node<'b>( - &'p self, + &self, source: &'s str, emacs: &'b Token<'s>, ) -> Result, Box>;