Implement compare optional pair.

This commit is contained in:
Tom Alexander 2023-12-29 16:51:52 -05:00
parent 2bfa8e59e7
commit 54085b5833
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
1 changed files with 74 additions and 1 deletions

View File

@ -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>,