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,
|
source: &'s str,
|
||||||
emacs: &'b Vec<Token<'s>>,
|
emacs: &'e Vec<Token<'s>>,
|
||||||
wasm: &serde_json::Map<String, serde_json::Value>,
|
wasm: &'w serde_json::Map<String, serde_json::Value>,
|
||||||
) -> Result<WasmDiffResult<'s>, Box<dyn std::error::Error>> {
|
) -> Result<WasmDiffResult<'s>, Box<dyn std::error::Error>> {
|
||||||
let mut result = WasmDiffResult::default();
|
let mut result = WasmDiffResult::default();
|
||||||
let mut emacs_list_iter = emacs.iter();
|
let mut emacs_list_iter = emacs.iter();
|
||||||
@ -289,7 +289,25 @@ fn compare_ast_node<'b, 's, 'p>(
|
|||||||
result.children.push(layer);
|
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)
|
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>(
|
// pub fn old_wasm_compare_document<'b, 's, 'p>(
|
||||||
// source: &'s str,
|
// source: &'s str,
|
||||||
// emacs: &'b Token<'s>,
|
// emacs: &'b Token<'s>,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user