From 62926bb91d94ba1b89498adf91d4de23b26c65f5 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Mon, 9 Oct 2023 22:28:32 -0400 Subject: [PATCH] compare_properties dynamic block. --- src/compare/diff.rs | 79 +++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 38 deletions(-) diff --git a/src/compare/diff.rs b/src/compare/diff.rs index 9f3266a..c5e4fb0 100644 --- a/src/compare/diff.rs +++ b/src/compare/diff.rs @@ -1360,51 +1360,54 @@ fn compare_dynamic_block<'b, 's>( emacs: &'b Token<'s>, rust: &'b DynamicBlock<'s>, ) -> Result, Box> { - let children = emacs.as_list()?; - let mut child_status = Vec::new(); let mut this_status = DiffStatus::Good; + let mut child_status = Vec::new(); let mut message = None; - // TODO: Compare :caption - // Compare name - let name = get_property_quoted_string(emacs, ":name")?; - if name.as_ref().map(String::as_str) != rust.name { - this_status = DiffStatus::Bad; - message = Some(format!( - "Name mismatch (emacs != rust) {:?} != {:?}", - name, rust.name - )); - } + compare_children( + source, + emacs, + &rust.children, + &mut child_status, + &mut this_status, + &mut message, + )?; - // Compare block-name - let block_name = get_property_quoted_string(emacs, ":block-name")? - .ok_or("Dynamic blocks should have a name.")?; - if block_name != rust.block_name { - this_status = DiffStatus::Bad; - message = Some(format!( - "Name mismatch (emacs != rust) {:?} != {:?}", - block_name, rust.block_name - )); - } - - // Compare arguments - let parameters = get_property_quoted_string(emacs, ":arguments")?; - match (parameters.as_ref(), rust.parameters) { - (None, None) => {} - (Some(emacs_parameters), Some(rust_parameters)) if emacs_parameters == rust_parameters => {} - _ => { - this_status = DiffStatus::Bad; - message = Some(format!( - "Parameters mismatch (emacs != rust) {:?} != {:?}", - parameters, rust.parameters - )); + for diff in compare_properties!( + source, + emacs, + rust, + ( + EmacsField::Optional(":name"), + |r| r.name, + compare_property_quoted_string + ), + ( + EmacsField::Optional(":caption"), + compare_identity, + compare_noop + ), + ( + EmacsField::Required(":block-name"), + |r| Some(r.block_name), + compare_property_quoted_string + ), + ( + EmacsField::Required(":arguments"), + |r| r.parameters, + compare_property_quoted_string + ) + ) { + match diff { + ComparePropertiesResult::NoChange => {} + ComparePropertiesResult::SelfChange(new_status, new_message) => { + this_status = new_status; + message = new_message + } + ComparePropertiesResult::DiffEntry(diff_entry) => child_status.push(diff_entry), } } - for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { - child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?); - } - Ok(DiffResult { status: this_status, name: rust.get_elisp_name(),