Add code to compare children.

This commit is contained in:
Tom Alexander 2023-12-29 16:06:07 -05:00
parent 5d31db39a4
commit 2bfa8e59e7
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE

View File

@ -124,10 +124,10 @@ fn compare_json_value<'b, 's>(
}
}
fn compare_ast_node<'b, 's, 'p>(
fn compare_ast_node<'e, 's, 'w>(
source: &'s str,
emacs: &'b Vec<Token<'s>>,
wasm: &serde_json::Map<String, serde_json::Value>,
emacs: &'e Vec<Token<'s>>,
wasm: &'w serde_json::Map<String, serde_json::Value>,
) -> Result<WasmDiffResult<'s>, Box<dyn std::error::Error>> {
let mut result = WasmDiffResult::default();
let mut emacs_list_iter = emacs.iter();
@ -289,7 +289,25 @@ fn compare_ast_node<'b, 's, 'p>(
result.children.push(layer);
}
// TODO: compare children
{
// Compare children.
let mut layer = WasmDiffResult::default();
if let Some(wasm_iter) = wasm
.get("children")
.map(|children| children.as_array())
.flatten()
.map(|children| children.iter())
{
layer.extend(wasm_compare_list(source, emacs_list_iter, wasm_iter)?)?;
} else {
layer.extend(wasm_compare_list(
source,
emacs_list_iter,
std::iter::empty::<&serde_json::Value>(),
)?)?;
}
result.children.push(layer);
}
Ok(result)
}
@ -350,6 +368,43 @@ pub(crate) fn wasm_get_emacs_standard_properties(
})
}
fn wasm_compare_list<'e, 's: 'e, 'w, EI, WI>(
source: &'s str,
emacs: EI,
wasm: WI,
) -> Result<WasmDiffResult<'s>, Box<dyn std::error::Error>>
where
EI: Iterator<Item = &'e Token<'s>> + ExactSizeIterator,
WI: Iterator<Item = &'w serde_json::Value> + ExactSizeIterator,
{
let emacs_length = emacs.len();
let wasm_length = wasm.len();
if emacs_length != wasm_length {
return Ok(WasmDiffResult {
status: vec![WasmDiffStatus::Bad(
format!(
"Child length mismatch. Emacs=({emacs:?}) Wasm=({wasm:?}).",
emacs = emacs_length,
wasm = wasm_length
)
.into(),
)],
children: Vec::new(),
name: "".into(),
});
}
let mut child_status = Vec::with_capacity(emacs_length);
for (emacs_child, wasm_child) in emacs.zip(wasm) {
child_status.push(compare_json_value(wasm_child, source, emacs_child)?);
}
Ok(WasmDiffResult {
status: Vec::new(),
children: child_status,
name: "".into(),
})
}
// pub fn old_wasm_compare_document<'b, 's, 'p>(
// source: &'s str,
// emacs: &'b Token<'s>,