From 67ddbec6b59f8b79ca958bca2ce7cdf0507c3fdb Mon Sep 17 00:00:00 2001 From: Ryan Geary Date: Wed, 24 Jun 2020 21:08:15 -0400 Subject: Use LineWriter when input is stdin (#10) --- src/choice.rs | 41 +++++++++++++---------------------------- src/main.rs | 18 ++++++++++++------ src/writeable.rs | 2 +- src/writer.rs | 13 ++++++------- 4 files changed, 32 insertions(+), 42 deletions(-) diff --git a/src/choice.rs b/src/choice.rs index d7447fe..9df4580 100644 --- a/src/choice.rs +++ b/src/choice.rs @@ -1,5 +1,4 @@ use std::convert::TryInto; -use std::io::{BufWriter, Write}; use std::iter::FromIterator; use crate::config::Config; @@ -36,12 +35,7 @@ impl Choice { } } - pub fn print_choice( - &self, - line: &String, - config: &Config, - handle: &mut BufWriter, - ) { + pub fn print_choice(&self, line: &String, config: &Config, handle: &mut W) { if config.opt.character_wise { let line_chars = line[0..line.len() - 1].chars(); self.print_choice_generic(line_chars, config, handle); @@ -62,10 +56,10 @@ impl Choice { self.negative_index } - fn print_choice_generic(&self, mut iter: I, config: &Config, handle: &mut BufWriter) + fn print_choice_generic(&self, mut iter: I, config: &Config, handle: &mut W) where - W: Write, - T: Writeable + Copy, + W: WriteReceiver, + T: Writeable, I: Iterator, { if self.is_reverse_range() && !self.has_negative_index() { @@ -81,23 +75,14 @@ impl Choice { } } - fn print_choice_loop(iter: I, config: &Config, handle: &mut BufWriter) - where - W: Write, - T: Writeable + Copy, - I: Iterator, - { - Choice::print_choice_loop_max_items(iter, config, handle, isize::max_value()); - } - fn print_choice_loop_max_items( iter: I, config: &Config, - handle: &mut BufWriter, + handle: &mut W, max_items: isize, ) where - W: Write, - T: Writeable + Copy, + W: WriteReceiver, + T: Writeable, I: Iterator, { let mut peek_iter = iter.peekable(); @@ -111,10 +96,10 @@ impl Choice { } } - fn print_choice_negative(&self, iter: I, config: &Config, handle: &mut BufWriter) + fn print_choice_negative(&self, iter: I, config: &Config, handle: &mut W) where - W: Write, - T: Writeable + Copy, + W: WriteReceiver, + T: Writeable, I: Iterator, { let vec = Vec::from_iter(iter); @@ -136,10 +121,10 @@ impl Choice { } } - fn print_choice_reverse(&self, mut iter: I, config: &Config, handle: &mut BufWriter) + fn print_choice_reverse(&self, mut iter: I, config: &Config, handle: &mut W) where - W: Write, - T: Writeable + Copy, + W: WriteReceiver, + T: Writeable, I: Iterator, { if self.end > 0 { diff --git a/src/main.rs b/src/main.rs index 4a8f1f1..6146621 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ use std::fs::File; -use std::io::{self, Read, Write}; +use std::io::{self, Read}; use std::process; use structopt::StructOpt; @@ -22,6 +22,16 @@ use writer::WriteReceiver; fn main() { let opt = Opt::from_args(); + + let stdout = io::stdout(); + let lock = stdout.lock(); + match opt.input { + Some(_) => main_generic(opt, &mut io::BufWriter::new(lock)), + None => main_generic(opt, &mut io::LineWriter::new(lock)), + } +} + +fn main_generic(opt: Opt, handle: &mut W) { let config = Config::new(opt); let read = match &config.opt.input { @@ -39,16 +49,12 @@ fn main() { let mut reader = reader::BufReader::new(read); let mut buffer = String::new(); - let stdout = io::stdout(); - let lock = stdout.lock(); - let mut handle = io::BufWriter::new(lock); - while let Some(line) = reader.read_line(&mut buffer) { match line { Ok(l) => { let choice_iter = &mut config.opt.choices.iter().peekable(); while let Some(choice) = choice_iter.next() { - choice.print_choice(&l, &config, &mut handle); + choice.print_choice(&l, &config, handle); if choice_iter.peek().is_some() { handle.write_separator(&config); } diff --git a/src/writeable.rs b/src/writeable.rs index 8dadde3..658b086 100644 --- a/src/writeable.rs +++ b/src/writeable.rs @@ -1,4 +1,4 @@ -pub trait Writeable { +pub trait Writeable: Copy { fn to_byte_buf(&self) -> Box<[u8]>; } diff --git a/src/writer.rs b/src/writer.rs index 00a93a1..cf30ee7 100644 --- a/src/writer.rs +++ b/src/writer.rs @@ -1,14 +1,9 @@ -use std::io::{BufWriter, Write}; +use std::io::{BufWriter, LineWriter, Write}; use crate::config::Config; use crate::writeable::Writeable; -pub trait WriteReceiver { - fn write_choice(&mut self, b: Wa, config: &Config, print_separator: bool); - fn write_separator(&mut self, config: &Config); -} - -impl WriteReceiver for BufWriter { +pub trait WriteReceiver: Write { fn write_choice(&mut self, b: Wa, config: &Config, print_separator: bool) { let num_bytes_written = match self.write(&b.to_byte_buf()) { Ok(x) => x, @@ -29,3 +24,7 @@ impl WriteReceiver for BufWriter { } } } + +impl WriteReceiver for BufWriter {} + +impl WriteReceiver for LineWriter {} -- cgit v1.2.3