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, | ||||
|     emacs: &'b Vec<Token<'s>>, | ||||
|     wasm: &serde_json::Map<String, serde_json::Value>, | ||||
|     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_list_iter = emacs.iter(); | ||||
| @ -289,7 +289,25 @@ fn compare_ast_node<'b, 's, 'p>( | ||||
|         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) | ||||
| } | ||||
| @ -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>(
 | ||||
| //     source: &'s str,
 | ||||
| //     emacs: &'b Token<'s>,
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tom Alexander
						Tom Alexander