on master help sign in
Move get_reader into inputfile module
commitd5b0502419dd919b75df20fd4798dce66c532d63 authorsharkdp <davidpeter@web.de> dateSun 7 Oct 2018, 11:54 (8 years ago) parent860f3e9
2 files changed+35−26
src/controller.rs+10−26 src/inputfile.rs+25
src/controller.rs+10−26
@@ -1,5 +1,4 @@
1−use std::fs::File;
2−use std::io::{self, BufRead, BufReader, Write};
1+use std::io::{self, BufRead, Write};
32
43use app::Config;
54use assets::HighlightingAssets;
@@ -9,8 +8,6 @@ use line_range::LineRange;
98use output::OutputType;
109use printer::{InteractivePrinter, Printer, SimplePrinter};
1110
12−const THEME_PREVIEW_FILE: &[u8] = include_bytes!("../assets/theme_preview.rs");
13−
1411pub struct Controller<'a> {
1512 config: &'a Config<'a>,
1613 assets: &'a HighlightingAssets,
@@ -26,13 +23,13 @@ impl<'b> Controller<'b> {
2623 let writer = output_type.handle()?;
2724 let mut no_errors: bool = true;
2825
29− for filename in &self.config.files {
26+ for input_file in &self.config.files {
3027 let result = if self.config.loop_through {
3128 let mut printer = SimplePrinter::new();
32− self.print_file(&mut printer, writer, *filename)
29+ self.print_file(&mut printer, writer, *input_file)
3330 } else {
34− let mut printer = InteractivePrinter::new(&self.config, &self.assets, *filename);
35− self.print_file(&mut printer, writer, *filename)
31+ let mut printer = InteractivePrinter::new(&self.config, &self.assets, *input_file);
32+ self.print_file(&mut printer, writer, *input_file)
3633 };
3734
3835 if let Err(error) = result {
@@ -48,28 +45,15 @@ impl<'b> Controller<'b> {
4845 &self,
4946 printer: &mut P,
5047 writer: &mut Write,
51− filename: InputFile<'a>,
48+ input_file: InputFile<'a>,
5249 ) -> Result<()> {
5350 let stdin = io::stdin();
54− {
55− let reader: Box<BufRead> = match filename {
56− InputFile::StdIn => Box::new(stdin.lock()),
57− InputFile::Ordinary(filename) => {
58− let file = File::open(filename)?;
59−
60− if file.metadata()?.is_dir() {
61− return Err(format!("'{}' is a directory.", filename).into());
62− }
51+ let reader = input_file.get_reader(&stdin)?;
6352
64− Box::new(BufReader::new(file))
65− }
66− InputFile::ThemePreviewFile => Box::new(THEME_PREVIEW_FILE),
67− };
53+ printer.print_header(writer, input_file)?;
54+ self.print_file_ranges(printer, writer, reader, &self.config.line_range)?;
55+ printer.print_footer(writer)?;
6856
69− printer.print_header(writer, filename)?;
70− self.print_file_ranges(printer, writer, reader, &self.config.line_range)?;
71− printer.print_footer(writer)?;
72− }
7357 Ok(())
7458 }
7559
src/inputfile.rs+25
@@ -1,6 +1,31 @@
1+use std::fs::File;
2+use std::io::{self, BufRead, BufReader};
3+
4+use errors::*;
5+
6+const THEME_PREVIEW_FILE: &[u8] = include_bytes!("../assets/theme_preview.rs");
7+
18#[derive(Debug, Clone, Copy, PartialEq)]
29pub enum InputFile<'a> {
310 StdIn,
411 Ordinary(&'a str),
512 ThemePreviewFile,
613}
14+
15+impl<'a> InputFile<'a> {
16+ pub fn get_reader(&self, stdin: &'a io::Stdin) -> Result<Box<dyn BufRead + 'a>> {
17+ match self {
18+ InputFile::StdIn => Ok(Box::new(stdin.lock())),
19+ InputFile::Ordinary(filename) => {
20+ let file = File::open(filename)?;
21+
22+ if file.metadata()?.is_dir() {
23+ return Err(format!("'{}' is a directory.", filename).into());
24+ }
25+
26+ Ok(Box::new(BufReader::new(file)))
27+ }
28+ InputFile::ThemePreviewFile => Ok(Box::new(THEME_PREVIEW_FILE)),
29+ }
30+ }
31+}