@@ -303,62 +303,11 @@ pub fn copy_all_but_n_lines<R: Read, W: Write>(
303303 Ok ( total_bytes_copied)
304304}
305305
306- /// Like `std::io::Take`, but for lines instead of bytes.
307- ///
308- /// This struct is generally created by calling [`take_lines`] on a
309- /// reader. Please see the documentation of [`take_lines`] for more
310- /// details.
311- pub struct TakeLines < T > {
312- inner : T ,
313- limit : u64 ,
314- separator : u8 ,
315- }
316-
317- impl < T : Read > Read for TakeLines < T > {
318- /// Read bytes from a buffer up to the requested number of lines.
319- fn read ( & mut self , buf : & mut [ u8 ] ) -> std:: io:: Result < usize > {
320- if self . limit == 0 {
321- return Ok ( 0 ) ;
322- }
323- match self . inner . read ( buf) {
324- Ok ( 0 ) => Ok ( 0 ) ,
325- Ok ( n) => {
326- for i in memchr_iter ( self . separator , & buf[ ..n] ) {
327- self . limit -= 1 ;
328- if self . limit == 0 {
329- return Ok ( i + 1 ) ;
330- }
331- }
332- Ok ( n)
333- }
334- Err ( e) => Err ( e) ,
335- }
336- }
337- }
338-
339- /// Create an adaptor that will read at most `limit` lines from a given reader.
340- ///
341- /// This function returns a new instance of `Read` that will read at
342- /// most `limit` lines, after which it will always return EOF
343- /// (`Ok(0)`).
344- ///
345- /// The `separator` defines the character to interpret as the line
346- /// ending. For the usual notion of "line", set this to `b'\n'`.
347- pub fn take_lines < R > ( reader : R , limit : u64 , separator : u8 ) -> TakeLines < R > {
348- TakeLines {
349- inner : reader,
350- limit,
351- separator,
352- }
353- }
354-
355306#[ cfg( test) ]
356307mod tests {
357308
358- use std:: io:: { BufRead , BufReader } ;
359-
360309 use crate :: take:: {
361- TakeAllBuffer , TakeAllLinesBuffer , copy_all_but_n_bytes, copy_all_but_n_lines, take_lines ,
310+ TakeAllBuffer , TakeAllLinesBuffer , copy_all_but_n_bytes, copy_all_but_n_lines,
362311 } ;
363312
364313 #[ test]
@@ -635,33 +584,4 @@ mod tests {
635584 assert_eq ! ( bytes_copied, 2 ) ;
636585 assert_eq ! ( output_reader. get_ref( ) [ ..] , input_buffer. as_bytes( ) [ 0 ..2 ] ) ;
637586 }
638-
639- #[ test]
640- fn test_zero_lines ( ) {
641- let input_reader = std:: io:: Cursor :: new ( "a\n b\n c\n " ) ;
642- let output_reader = BufReader :: new ( take_lines ( input_reader, 0 , b'\n' ) ) ;
643- let mut iter = output_reader. lines ( ) . map ( |l| l. unwrap ( ) ) ;
644- assert_eq ! ( None , iter. next( ) ) ;
645- }
646-
647- #[ test]
648- fn test_fewer_lines ( ) {
649- let input_reader = std:: io:: Cursor :: new ( "a\n b\n c\n " ) ;
650- let output_reader = BufReader :: new ( take_lines ( input_reader, 2 , b'\n' ) ) ;
651- let mut iter = output_reader. lines ( ) . map ( |l| l. unwrap ( ) ) ;
652- assert_eq ! ( Some ( String :: from( "a" ) ) , iter. next( ) ) ;
653- assert_eq ! ( Some ( String :: from( "b" ) ) , iter. next( ) ) ;
654- assert_eq ! ( None , iter. next( ) ) ;
655- }
656-
657- #[ test]
658- fn test_more_lines ( ) {
659- let input_reader = std:: io:: Cursor :: new ( "a\n b\n c\n " ) ;
660- let output_reader = BufReader :: new ( take_lines ( input_reader, 4 , b'\n' ) ) ;
661- let mut iter = output_reader. lines ( ) . map ( |l| l. unwrap ( ) ) ;
662- assert_eq ! ( Some ( String :: from( "a" ) ) , iter. next( ) ) ;
663- assert_eq ! ( Some ( String :: from( "b" ) ) , iter. next( ) ) ;
664- assert_eq ! ( Some ( String :: from( "c" ) ) , iter. next( ) ) ;
665- assert_eq ! ( None , iter. next( ) ) ;
666- }
667587}
0 commit comments