Implement compare optional pair.
This commit is contained in:
parent
2bfa8e59e7
commit
54085b5833
@ -86,6 +86,10 @@ fn compare_json_value<'b, 's>(
|
||||
source: &'s str,
|
||||
emacs: &'b Token<'s>,
|
||||
) -> Result<WasmDiffResult<'s>, Box<dyn std::error::Error>> {
|
||||
println!("XXXXXXXXXXXXXX compare_json_value XXXXXXXXXXXXXX");
|
||||
println!("{:?}", emacs);
|
||||
println!("{:?}", value);
|
||||
println!("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
|
||||
match (value, emacs) {
|
||||
(serde_json::Value::Object(wasm), Token::List(el)) if wasm.contains_key("ast-node") => {
|
||||
// We hit a regular ast node.
|
||||
@ -97,6 +101,14 @@ fn compare_json_value<'b, 's>(
|
||||
// We hit a string compared against a quoted string from elisp (as opposed to an unquoted literal).
|
||||
compare_quoted_string(source, e, w)
|
||||
}
|
||||
(serde_json::Value::Array(w), Token::List(e)) => {
|
||||
wasm_compare_list(source, e.iter(), w.iter())
|
||||
}
|
||||
(serde_json::Value::Object(wasm), Token::List(e))
|
||||
if wasm.contains_key("optval") && wasm.contains_key("val") =>
|
||||
{
|
||||
compare_optional_pair(source, e, wasm)
|
||||
}
|
||||
(serde_json::Value::Null, Token::Atom(_)) => todo!(),
|
||||
(serde_json::Value::Null, Token::List(_)) => todo!(),
|
||||
(serde_json::Value::Null, Token::TextWithProperties(_)) => todo!(),
|
||||
@ -114,7 +126,7 @@ fn compare_json_value<'b, 's>(
|
||||
(serde_json::Value::String(_), Token::TextWithProperties(_)) => todo!(),
|
||||
(serde_json::Value::String(_), Token::Vector(_)) => todo!(),
|
||||
(serde_json::Value::Array(_), Token::Atom(_)) => todo!(),
|
||||
(serde_json::Value::Array(_), Token::List(_)) => todo!(),
|
||||
// (serde_json::Value::Array(_), Token::List(_)) => todo!(),
|
||||
(serde_json::Value::Array(_), Token::TextWithProperties(_)) => todo!(),
|
||||
(serde_json::Value::Array(_), Token::Vector(_)) => todo!(),
|
||||
(serde_json::Value::Object(_), Token::Atom(_)) => todo!(),
|
||||
@ -405,6 +417,67 @@ where
|
||||
})
|
||||
}
|
||||
|
||||
fn compare_optional_pair<'e, 's, 'w>(
|
||||
source: &'s str,
|
||||
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 wasm_optval = wasm
|
||||
.get("optval")
|
||||
.ok_or(r#"Wasm optional pair should have an "optval" attribute."#)?;
|
||||
let wasm_val = wasm
|
||||
.get("val")
|
||||
.ok_or(r#"Wasm optional pair should have an "optval" attribute."#)?;
|
||||
if let serde_json::Value::Null = wasm_optval {
|
||||
// If the optval is null, then the elisp should have just a single value of a quoted string.
|
||||
if emacs.len() != 1 {
|
||||
return Ok(WasmDiffResult {
|
||||
status: vec![WasmDiffStatus::Bad(
|
||||
format!(
|
||||
"Optional pair with null optval should have 1 element. Emacs=({emacs:?}) Wasm=({wasm:?}).",
|
||||
emacs = emacs,
|
||||
wasm = wasm
|
||||
)
|
||||
.into(),
|
||||
)],
|
||||
children: Vec::new(),
|
||||
name: "".into(),
|
||||
});
|
||||
}
|
||||
|
||||
let emacs_val = emacs
|
||||
.first()
|
||||
.expect("If-statement proves this will be Some.");
|
||||
result.extend(compare_json_value(wasm_val, source, emacs_val)?)?;
|
||||
} else {
|
||||
// If the optval is not null, then the elisp should have 3 values, the optval, a dot, and the val.
|
||||
if emacs.len() != 3 {
|
||||
return Ok(WasmDiffResult {
|
||||
status: vec![WasmDiffStatus::Bad(
|
||||
format!(
|
||||
"Optional pair with non-null optval should have 3 elements. Emacs=({emacs:?}) Wasm=({wasm:?}).",
|
||||
emacs = emacs,
|
||||
wasm = wasm
|
||||
)
|
||||
.into(),
|
||||
)],
|
||||
children: Vec::new(),
|
||||
name: "".into(),
|
||||
});
|
||||
}
|
||||
let emacs_optval = emacs
|
||||
.first()
|
||||
.expect("If-statement proves this will be Some.");
|
||||
let emacs_val = emacs
|
||||
.get(2)
|
||||
.expect("If-statement proves this will be Some.");
|
||||
result.extend(compare_json_value(wasm_optval, source, emacs_optval)?)?;
|
||||
result.extend(compare_json_value(wasm_val, source, emacs_val)?)?;
|
||||
}
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
// 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