| 360 | type Item = DisplayLine<'a>; |
| 361 | |
| 362 | fn next(&mut self) -> Option<Self::Item> { |
| 363 | loop { |
| 364 | if self.op_idx >= self.diff.diff_result.len() { |
| 365 | return None; |
| 366 | } |
| 367 | |
| 368 | let op = &self.diff.diff_result.ops()[self.op_idx]; |
| 369 | |
| 370 | match op { |
| 371 | DiffOp::Equal { |
| 372 | old_pos, |
| 373 | new_pos: _, |
| 374 | len, |
| 375 | } => { |
| 376 | if self.pos_in_op < *len { |
| 377 | let line_idx = old_pos + self.pos_in_op; |
| 378 | let raw = self.diff.old_lines.get(line_idx)?.content(); |
| 379 | |
| 380 | let display_line = DisplayLine::new( |
| 381 | LineStatus::Unchanged, |
| 382 | raw, |
| 383 | Some(self.old_line_num), |
| 384 | Some(self.new_line_num), |
| 385 | ); |
| 386 | |
| 387 | self.pos_in_op += 1; |
| 388 | self.old_line_num += 1; |
| 389 | self.new_line_num += 1; |
| 390 | |
| 391 | return Some(display_line); |
| 392 | } |
| 393 | } |
| 394 | |
| 395 | DiffOp::Delete { old_pos, len, .. } => { |
| 396 | if self.pos_in_op < *len { |
| 397 | let line_idx = old_pos + self.pos_in_op; |
| 398 | let raw = self.diff.old_lines.get(line_idx)?.content(); |
| 399 | |
| 400 | let display_line = DisplayLine::new( |
| 401 | LineStatus::Removed, |
| 402 | raw, |
| 403 | Some(self.old_line_num), |
| 404 | None, |
| 405 | ); |
| 406 | |
| 407 | self.pos_in_op += 1; |
| 408 | self.old_line_num += 1; |
| 409 | |
| 410 | return Some(display_line); |
| 411 | } |
| 412 | } |
| 413 | |
| 414 | DiffOp::Insert { new_pos, len, .. } => { |
| 415 | if self.pos_in_op < *len { |
| 416 | let line_idx = new_pos + self.pos_in_op; |
| 417 | let raw = self.diff.new_lines.get(line_idx)?.content(); |
| 418 | |
| 419 | let display_line = |