-
Notifications
You must be signed in to change notification settings - Fork 22
Open
Description
The code for Option
serde-diff/src/implementation.rs
Lines 315 to 356 in e461da4
| let mut self_iter = self.iter(); | |
| let mut other_iter = other.iter(); | |
| let mut idx = 0; | |
| let mut need_exit = false; | |
| let mut changed = false; | |
| loop { | |
| let self_item = self_iter.next(); | |
| let other_item = other_iter.next(); | |
| match (self_item, other_item) { | |
| (None, None) => break, | |
| (Some(_), None) => { | |
| let mut num_to_remove = 1; | |
| while self_iter.next().is_some() { | |
| num_to_remove += 1; | |
| } | |
| ctx.save_command::<()>(&DiffCommandRef::Remove(num_to_remove), true, true)?; | |
| changed = true; | |
| } | |
| (None, Some(other_item)) => { | |
| ctx.save_command::<()>( | |
| &DiffCommandRef::Enter(DiffPathElementValue::AddToCollection), | |
| false, | |
| true, | |
| )?; | |
| ctx.save_command(&DiffCommandRef::Value(other_item), true, true)?; | |
| need_exit = true; | |
| changed = true; | |
| } | |
| (Some(self_item), Some(other_item)) => { | |
| ctx.push_collection_index(idx); | |
| if <T as SerdeDiff>::diff(self_item, ctx, other_item)? { | |
| need_exit = true; | |
| changed = true; | |
| } | |
| ctx.pop_path_element()?; | |
| } | |
| } | |
| idx += 1; | |
| } | |
| if need_exit { | |
| ctx.save_command::<()>(&DiffCommandRef::Exit, true, false)?; | |
| } |
would be more readable if written like the code for arrays
serde-diff/src/implementation.rs
Lines 25 to 37 in e461da4
| let mut need_exit = false; | |
| let mut changed = false; | |
| for (idx, (self_item, other_item)) in self.iter().zip(other.iter()).enumerate() { | |
| ctx.push_collection_index(idx); | |
| if <T as $crate::SerdeDiff>::diff(self_item, ctx, other_item)? { | |
| need_exit = true; | |
| changed = true; | |
| } | |
| ctx.pop_path_element()?; | |
| } | |
| if need_exit { | |
| ctx.save_command::<()>(&DiffCommandRef::Exit, true, false)?; | |
| } |
Metadata
Metadata
Assignees
Labels
No labels