Add code to compare children.
This commit is contained in:
parent
5d31db39a4
commit
2bfa8e59e7
@ -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>,
|
||||
|
Loading…
x
Reference in New Issue
Block a user