@@ -3,24 +3,43 @@ use diff::{chars, lines, Result, Result::*};
3
3
4
4
#[ derive( Default ) ]
5
5
struct DiffState < ' a > {
6
- skipped_lines : usize ,
7
- /// When we skip a line, remember it, in case
8
- /// we end up only skipping one line. In that case we just
9
- /// print the line instead of `... skipped one line ...`
10
- last_skipped_line : Option < & ' a str > ,
6
+ /// When we skip lines, remember the last `CONTEXT` ones to
7
+ /// display after the "skipped N lines" message
8
+ skipped_lines : Vec < & ' a str > ,
11
9
/// When we see a removed line, we don't print it, we
12
10
/// keep it around to compare it with the next added line.
13
11
prev_left : Option < & ' a str > ,
14
12
}
15
13
14
+ /// How many lines of context are displayed around the actual diffs
15
+ const CONTEXT : usize = 2 ;
16
+
16
17
impl < ' a > DiffState < ' a > {
17
18
fn print_skip ( & mut self ) {
18
- match self . skipped_lines {
19
- 0 => { }
20
- 1 => eprintln ! ( " {}" , self . last_skipped_line. unwrap( ) ) ,
21
- _ => eprintln ! ( "... {} lines skipped ..." , self . skipped_lines) ,
19
+ let half = self . skipped_lines . len ( ) / 2 ;
20
+ if half < CONTEXT {
21
+ for line in self . skipped_lines . drain ( ..) {
22
+ eprintln ! ( " {line}" ) ;
23
+ }
24
+ } else {
25
+ for line in self . skipped_lines . iter ( ) . take ( CONTEXT ) {
26
+ eprintln ! ( " {line}" ) ;
27
+ }
28
+ let skipped = self . skipped_lines . len ( ) - CONTEXT * 2 ;
29
+ match skipped {
30
+ 0 => { }
31
+ 1 => eprintln ! ( " {}" , self . skipped_lines[ CONTEXT ] ) ,
32
+ _ => eprintln ! ( "... {skipped} lines skipped ..." ) ,
33
+ }
34
+ for line in self . skipped_lines . iter ( ) . rev ( ) . take ( CONTEXT ) . rev ( ) {
35
+ eprintln ! ( " {line}" ) ;
36
+ }
22
37
}
23
- self . skipped_lines = 0 ;
38
+ self . skipped_lines . clear ( ) ;
39
+ }
40
+
41
+ fn skip ( & mut self , line : & ' a str ) {
42
+ self . skipped_lines . push ( line) ;
24
43
}
25
44
26
45
fn print_prev ( & mut self ) {
@@ -46,8 +65,7 @@ impl<'a> DiffState<'a> {
46
65
}
47
66
Both ( l, _) => {
48
67
self . print_prev ( ) ;
49
- self . last_skipped_line = Some ( l) ;
50
- self . skipped_lines += 1
68
+ self . skip ( l) ;
51
69
}
52
70
Right ( r) => {
53
71
if let Some ( l) = self . prev_left . take ( ) {
0 commit comments