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 > ) ,
@@ -279,13 +281,16 @@ fn get_modification_time(file_path: &str) -> String {
279281}
280282
281283#[ must_use]
284+ #[ allow( clippy:: too_many_arguments) ]
282285pub fn diff (
283286 expected : & [ u8 ] ,
284287 expected_filename : & str ,
285288 actual : & [ u8 ] ,
286289 actual_filename : & str ,
287290 context_size : usize ,
288291 stop_early : bool ,
292+ expand_tabs : bool ,
293+ tabsize : usize ,
289294) -> Vec < u8 > {
290295 let expected_file_modified_time = get_modification_time ( expected_filename) ;
291296 let actual_file_modified_time = get_modification_time ( actual_filename) ;
@@ -332,17 +337,20 @@ pub fn diff(
332337 match line {
333338 DiffLine :: Context ( e) => {
334339 write ! ( output, " " ) . expect ( "write to Vec is infallible" ) ;
335- output. write_all ( & e) . expect ( "write to Vec is infallible" ) ;
340+ do_write_line ( & mut output, & e, expand_tabs, tabsize)
341+ . expect ( "write to Vec is infallible" ) ;
336342 writeln ! ( output) . unwrap ( ) ;
337343 }
338344 DiffLine :: Change ( e) => {
339345 write ! ( output, "! " ) . expect ( "write to Vec is infallible" ) ;
340- output. write_all ( & e) . expect ( "write to Vec is infallible" ) ;
346+ do_write_line ( & mut output, & e, expand_tabs, tabsize)
347+ . expect ( "write to Vec is infallible" ) ;
341348 writeln ! ( output) . unwrap ( ) ;
342349 }
343350 DiffLine :: Add ( e) => {
344351 write ! ( output, "- " ) . expect ( "write to Vec is infallible" ) ;
345- 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" ) ;
346354 writeln ! ( output) . unwrap ( ) ;
347355 }
348356 }
@@ -359,17 +367,20 @@ pub fn diff(
359367 match line {
360368 DiffLine :: Context ( e) => {
361369 write ! ( output, " " ) . expect ( "write to Vec is infallible" ) ;
362- output. write_all ( & e) . expect ( "write to Vec is infallible" ) ;
370+ do_write_line ( & mut output, & e, expand_tabs, tabsize)
371+ . expect ( "write to Vec is infallible" ) ;
363372 writeln ! ( output) . unwrap ( ) ;
364373 }
365374 DiffLine :: Change ( e) => {
366375 write ! ( output, "! " ) . expect ( "write to Vec is infallible" ) ;
367- output. write_all ( & e) . expect ( "write to Vec is infallible" ) ;
376+ do_write_line ( & mut output, & e, expand_tabs, tabsize)
377+ . expect ( "write to Vec is infallible" ) ;
368378 writeln ! ( output) . unwrap ( ) ;
369379 }
370380 DiffLine :: Add ( e) => {
371381 write ! ( output, "+ " ) . expect ( "write to Vec is infallible" ) ;
372- output. write_all ( & e) . expect ( "write to Vec is infallible" ) ;
382+ do_write_line ( & mut output, & e, expand_tabs, tabsize)
383+ . expect ( "write to Vec is infallible" ) ;
373384 writeln ! ( output) . unwrap ( ) ;
374385 }
375386 }
@@ -443,6 +454,8 @@ mod tests {
443454 & format ! ( "{target}/alef" ) ,
444455 2 ,
445456 false ,
457+ false ,
458+ 8 ,
446459 ) ;
447460 File :: create ( & format ! ( "{target}/ab.diff" ) )
448461 . unwrap ( )
@@ -523,6 +536,8 @@ mod tests {
523536 & format ! ( "{target}/alef_" ) ,
524537 2 ,
525538 false ,
539+ false ,
540+ 8 ,
526541 ) ;
527542 File :: create ( & format ! ( "{target}/ab_.diff" ) )
528543 . unwrap ( )
@@ -606,6 +621,8 @@ mod tests {
606621 & format ! ( "{target}/alefx" ) ,
607622 2 ,
608623 false ,
624+ false ,
625+ 8 ,
609626 ) ;
610627 File :: create ( & format ! ( "{target}/abx.diff" ) )
611628 . unwrap ( )
@@ -692,6 +709,8 @@ mod tests {
692709 & format ! ( "{target}/alefr" ) ,
693710 2 ,
694711 false ,
712+ false ,
713+ 8 ,
695714 ) ;
696715 File :: create ( & format ! ( "{target}/abr.diff" ) )
697716 . unwrap ( )
@@ -730,10 +749,10 @@ mod tests {
730749
731750 let from_filename = "foo" ;
732751 let _ = File :: create ( & format ! ( "foo" ) ) . unwrap ( ) ;
733- let from = vec ! [ "a" , "b" , "c" , "" ] . join ( "\n " ) ;
752+ let from = [ "a" , "b" , "c" , "" ] . join ( "\n " ) ;
734753 let to_filename = "bar" ;
735754 let _ = File :: create ( & format ! ( "bar" ) ) . unwrap ( ) ;
736- let to = vec ! [ "a" , "d" , "c" , "" ] . join ( "\n " ) ;
755+ let to = [ "a" , "d" , "c" , "" ] . join ( "\n " ) ;
737756 let context_size: usize = 3 ;
738757
739758 let diff_full = diff (
@@ -743,13 +762,15 @@ mod tests {
743762 to_filename,
744763 context_size,
745764 false ,
765+ false ,
766+ 8 ,
746767 ) ;
747768
748769 let diff_full_text = str:: from_utf8 ( & diff_full) . unwrap ( ) ;
749770 let re = Regex :: new ( r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+ [+-]\d{4}" ) . unwrap ( ) ;
750771 let diff_full = re. replace_all ( diff_full_text, "" ) ;
751772
752- let expected_full = vec ! [
773+ let expected_full = [
753774 "*** foo\t " ,
754775 "--- bar\t " ,
755776 "***************" ,
@@ -773,12 +794,14 @@ mod tests {
773794 to_filename,
774795 context_size,
775796 true ,
797+ false ,
798+ 8 ,
776799 ) ;
777800
778801 let diff_brief_text = str:: from_utf8 ( & diff_brief) . unwrap ( ) ;
779802 let re = Regex :: new ( r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+ [+-]\d{4}" ) . unwrap ( ) ;
780803 let diff_brief = re. replace_all ( diff_brief_text, "" ) ;
781- let expected_brief = vec ! [ "*** foo\t " , "--- bar\t " , "" ] . join ( "\n " ) ;
804+ let expected_brief = [ "*** foo\t " , "--- bar\t " , "" ] . join ( "\n " ) ;
782805 assert_eq ! ( diff_brief, expected_brief) ;
783806
784807 let nodiff_full = diff (
@@ -788,6 +811,8 @@ mod tests {
788811 to_filename,
789812 context_size,
790813 false ,
814+ false ,
815+ 8 ,
791816 ) ;
792817 assert ! ( nodiff_full. is_empty( ) ) ;
793818
@@ -798,6 +823,8 @@ mod tests {
798823 to_filename,
799824 context_size,
800825 true ,
826+ false ,
827+ 8 ,
801828 ) ;
802829 assert ! ( nodiff_brief. is_empty( ) ) ;
803830 }
0 commit comments