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,
|
source: &'s str,
|
||||||
emacs: &'b Token<'s>,
|
emacs: &'b Token<'s>,
|
||||||
) -> Result<WasmDiffResult<'s>, Box<dyn std::error::Error>> {
|
) -> Result<WasmDiffResult<'s>, Box<dyn std::error::Error>> {
|
||||||
|
println!("XXXXXXXXXXXXXX compare_json_value XXXXXXXXXXXXXX");
|
||||||
|
println!("{:?}", emacs);
|
||||||
|
println!("{:?}", value);
|
||||||
|
println!("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
|
||||||
match (value, emacs) {
|
match (value, emacs) {
|
||||||
(serde_json::Value::Object(wasm), Token::List(el)) if wasm.contains_key("ast-node") => {
|
(serde_json::Value::Object(wasm), Token::List(el)) if wasm.contains_key("ast-node") => {
|
||||||
// We hit a regular 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).
|
// We hit a string compared against a quoted string from elisp (as opposed to an unquoted literal).
|
||||||
compare_quoted_string(source, e, w)
|
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::Atom(_)) => todo!(),
|
||||||
(serde_json::Value::Null, Token::List(_)) => todo!(),
|
(serde_json::Value::Null, Token::List(_)) => todo!(),
|
||||||
(serde_json::Value::Null, Token::TextWithProperties(_)) => 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::TextWithProperties(_)) => todo!(),
|
||||||
(serde_json::Value::String(_), Token::Vector(_)) => todo!(),
|
(serde_json::Value::String(_), Token::Vector(_)) => todo!(),
|
||||||
(serde_json::Value::Array(_), Token::Atom(_)) => 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::TextWithProperties(_)) => todo!(),
|
||||||
(serde_json::Value::Array(_), Token::Vector(_)) => todo!(),
|
(serde_json::Value::Array(_), Token::Vector(_)) => todo!(),
|
||||||
(serde_json::Value::Object(_), Token::Atom(_)) => 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>(
|
// 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