Implement src block.
This commit is contained in:
@@ -54,6 +54,10 @@ fn compare_json_value<'b, 's>(
|
||||
// We hit an object tree additional property.
|
||||
compare_object_tree(source, el, wasm)
|
||||
}
|
||||
(serde_json::Value::Object(wasm), Token::List(el)) if wasm.contains_key("number-lines") => {
|
||||
// We hit an object tree additional property.
|
||||
compare_number_lines(source, el, wasm)
|
||||
}
|
||||
(serde_json::Value::Object(w), Token::TextWithProperties(e)) if is_plain_text(w) => {
|
||||
compare_plain_text(source, e, w)
|
||||
}
|
||||
@@ -628,6 +632,93 @@ fn compare_object_tree<'e, 's, 'w>(
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn compare_number_lines<'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 mut emacs_iter = emacs.iter();
|
||||
let emacs_directive = emacs_iter
|
||||
.next()
|
||||
.ok_or("Emacs number lines should have 3 children.")?
|
||||
.as_atom()?;
|
||||
let emacs_number: i64 = emacs_iter
|
||||
.skip(1)
|
||||
.next()
|
||||
.ok_or("Emacs number lines should have 3 children.")?
|
||||
.as_atom()?
|
||||
.parse()?;
|
||||
if wasm.contains_key("new") {
|
||||
let wasm_number = wasm
|
||||
.get("new")
|
||||
.ok_or(r#"Wasm number lines should have a "new" attribute."#)?
|
||||
.as_i64()
|
||||
.ok_or(r#"Wasm number lines "new" attribute should be a number."#)?;
|
||||
if emacs_directive != "new" {
|
||||
result.status.push(WasmDiffStatus::Bad(
|
||||
format!(
|
||||
"Number lines directive mismatch. Emacs=({emacs:?}) Wasm=({wasm:?}).",
|
||||
emacs = emacs_directive,
|
||||
wasm = "new"
|
||||
)
|
||||
.into(),
|
||||
));
|
||||
return Ok(result);
|
||||
}
|
||||
if emacs_number != wasm_number {
|
||||
result.status.push(WasmDiffStatus::Bad(
|
||||
format!(
|
||||
"Number lines number mismatch. Emacs=({emacs:?}) Wasm=({wasm:?}).",
|
||||
emacs = emacs_number,
|
||||
wasm = wasm_number
|
||||
)
|
||||
.into(),
|
||||
));
|
||||
return Ok(result);
|
||||
}
|
||||
} else if wasm.contains_key("continued") {
|
||||
let wasm_number = wasm
|
||||
.get("continued")
|
||||
.ok_or(r#"Wasm number lines should have a "continued" attribute."#)?
|
||||
.as_i64()
|
||||
.ok_or(r#"Wasm number lines "continued" attribute should be a number."#)?;
|
||||
if emacs_directive != "continued" {
|
||||
result.status.push(WasmDiffStatus::Bad(
|
||||
format!(
|
||||
"Number lines directive mismatch. Emacs=({emacs:?}) Wasm=({wasm:?}).",
|
||||
emacs = emacs_directive,
|
||||
wasm = "continued"
|
||||
)
|
||||
.into(),
|
||||
));
|
||||
return Ok(result);
|
||||
}
|
||||
if emacs_number != wasm_number {
|
||||
result.status.push(WasmDiffStatus::Bad(
|
||||
format!(
|
||||
"Number lines number mismatch. Emacs=({emacs:?}) Wasm=({wasm:?}).",
|
||||
emacs = emacs_number,
|
||||
wasm = wasm_number
|
||||
)
|
||||
.into(),
|
||||
));
|
||||
return Ok(result);
|
||||
}
|
||||
} else {
|
||||
result.status.push(WasmDiffStatus::Bad(
|
||||
format!(
|
||||
"Unrecognized number lines directive. Wasm=({wasm:?}).",
|
||||
wasm = wasm
|
||||
)
|
||||
.into(),
|
||||
));
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn is_plain_text<'e, 's, 'w>(wasm: &'w serde_json::Map<String, serde_json::Value>) -> bool {
|
||||
if let Some(serde_json::Value::String(node_type)) = wasm.get("ast-node") {
|
||||
node_type == "plain-text"
|
||||
|
||||
Reference in New Issue
Block a user