The code for Option
|
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
|
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)?; |
|
} |
The code for
Optionserde-diff/src/implementation.rs
Lines 315 to 356 in e461da4
would be more readable if written like the code for arrays
serde-diff/src/implementation.rs
Lines 25 to 37 in e461da4