66use std:: collections:: VecDeque ;
77use std:: io:: Write ;
88
9+ use crate :: utils:: do_write_line;
10+
911#[ derive( Debug , PartialEq ) ]
1012pub enum DiffLine {
1113 Context ( Vec < u8 > ) ,
@@ -263,13 +265,16 @@ fn make_diff(
263265}
264266
265267#[ must_use]
268+ #[ allow( clippy:: too_many_arguments) ]
266269pub fn diff (
267270 expected : & [ u8 ] ,
268271 expected_filename : & str ,
269272 actual : & [ u8 ] ,
270273 actual_filename : & str ,
271274 context_size : usize ,
272275 stop_early : bool ,
276+ expand_tabs : bool ,
277+ tabsize : usize ,
273278) -> Vec < u8 > {
274279 let mut output = format ! ( "*** {expected_filename}\t \n --- {actual_filename}\t \n " ) . into_bytes ( ) ;
275280 let diff_results = make_diff ( expected, actual, context_size, stop_early) ;
@@ -314,17 +319,20 @@ pub fn diff(
314319 match line {
315320 DiffLine :: Context ( e) => {
316321 write ! ( output, " " ) . expect ( "write to Vec is infallible" ) ;
317- output. write_all ( & e) . expect ( "write to Vec is infallible" ) ;
322+ do_write_line ( & mut output, & e, expand_tabs, tabsize)
323+ . expect ( "write to Vec is infallible" ) ;
318324 writeln ! ( output) . unwrap ( ) ;
319325 }
320326 DiffLine :: Change ( e) => {
321327 write ! ( output, "! " ) . expect ( "write to Vec is infallible" ) ;
322- output. write_all ( & e) . expect ( "write to Vec is infallible" ) ;
328+ do_write_line ( & mut output, & e, expand_tabs, tabsize)
329+ . expect ( "write to Vec is infallible" ) ;
323330 writeln ! ( output) . unwrap ( ) ;
324331 }
325332 DiffLine :: Add ( e) => {
326333 write ! ( output, "- " ) . expect ( "write to Vec is infallible" ) ;
327- output. write_all ( & e) . expect ( "write to Vec is infallible" ) ;
334+ do_write_line ( & mut output, & e, expand_tabs, tabsize)
335+ . expect ( "write to Vec is infallible" ) ;
328336 writeln ! ( output) . unwrap ( ) ;
329337 }
330338 }
@@ -341,17 +349,20 @@ pub fn diff(
341349 match line {
342350 DiffLine :: Context ( e) => {
343351 write ! ( output, " " ) . expect ( "write to Vec is infallible" ) ;
344- output. write_all ( & e) . expect ( "write to Vec is infallible" ) ;
352+ do_write_line ( & mut output, & e, expand_tabs, tabsize)
353+ . expect ( "write to Vec is infallible" ) ;
345354 writeln ! ( output) . unwrap ( ) ;
346355 }
347356 DiffLine :: Change ( e) => {
348357 write ! ( output, "! " ) . expect ( "write to Vec is infallible" ) ;
349- output. write_all ( & e) . expect ( "write to Vec is infallible" ) ;
358+ do_write_line ( & mut output, & e, expand_tabs, tabsize)
359+ . expect ( "write to Vec is infallible" ) ;
350360 writeln ! ( output) . unwrap ( ) ;
351361 }
352362 DiffLine :: Add ( e) => {
353363 write ! ( output, "+ " ) . expect ( "write to Vec is infallible" ) ;
354- output. write_all ( & e) . expect ( "write to Vec is infallible" ) ;
364+ do_write_line ( & mut output, & e, expand_tabs, tabsize)
365+ . expect ( "write to Vec is infallible" ) ;
355366 writeln ! ( output) . unwrap ( ) ;
356367 }
357368 }
@@ -424,6 +435,8 @@ mod tests {
424435 & format ! ( "{target}/alef" ) ,
425436 2 ,
426437 false ,
438+ false ,
439+ 8 ,
427440 ) ;
428441 File :: create ( & format ! ( "{target}/ab.diff" ) )
429442 . unwrap ( )
@@ -503,6 +516,8 @@ mod tests {
503516 & format ! ( "{target}/alef_" ) ,
504517 2 ,
505518 false ,
519+ false ,
520+ 8 ,
506521 ) ;
507522 File :: create ( & format ! ( "{target}/ab_.diff" ) )
508523 . unwrap ( )
@@ -585,6 +600,8 @@ mod tests {
585600 & format ! ( "{target}/alefx" ) ,
586601 2 ,
587602 false ,
603+ false ,
604+ 8 ,
588605 ) ;
589606 File :: create ( & format ! ( "{target}/abx.diff" ) )
590607 . unwrap ( )
@@ -670,6 +687,8 @@ mod tests {
670687 & format ! ( "{target}/alefr" ) ,
671688 2 ,
672689 false ,
690+ false ,
691+ 8 ,
673692 ) ;
674693 File :: create ( & format ! ( "{target}/abr.diff" ) )
675694 . unwrap ( )
@@ -715,6 +734,8 @@ mod tests {
715734 to_filename,
716735 context_size,
717736 false ,
737+ false ,
738+ 8 ,
718739 ) ;
719740 let expected_full = [
720741 "*** foo\t " ,
@@ -740,6 +761,8 @@ mod tests {
740761 to_filename,
741762 context_size,
742763 true ,
764+ false ,
765+ 8 ,
743766 ) ;
744767 let expected_brief = [ "*** foo\t " , "--- bar\t " , "" ] . join ( "\n " ) ;
745768 assert_eq ! ( diff_brief, expected_brief. as_bytes( ) ) ;
@@ -751,6 +774,8 @@ mod tests {
751774 to_filename,
752775 context_size,
753776 false ,
777+ false ,
778+ 8 ,
754779 ) ;
755780 assert ! ( nodiff_full. is_empty( ) ) ;
756781
@@ -761,6 +786,8 @@ mod tests {
761786 to_filename,
762787 context_size,
763788 true ,
789+ false ,
790+ 8 ,
764791 ) ;
765792 assert ! ( nodiff_brief. is_empty( ) ) ;
766793 }
0 commit comments