1use std::io::{self, Write};
4use assets::HighlightingAssets;
6use inputfile::{InputFile, InputFileReader};
7use line_range::LineRange;
9use printer::{InteractivePrinter, Printer, SimplePrinter};
11pub struct Controller<'a> {
12 config: &'a Config<'a>,
13 assets: &'a HighlightingAssets,
16impl<'b> Controller<'b> {
17 pub fn new<'a>(config: &'a Config, assets: &'a HighlightingAssets) -> Controller<'a> {
18 Controller { config, assets }
21 pub fn run(&self) -> Result<bool> {
22 let mut output_type = OutputType::from_mode(self.config.paging_mode);
23 let writer = output_type.handle()?;
24 let mut no_errors: bool = true;
26 let stdin = io::stdin();
28 for input_file in &self.config.files {
29 let mut reader = input_file.get_reader(&stdin)?;
31 let result = if self.config.loop_through {
32 let mut printer = SimplePrinter::new();
33 self.print_file(reader, &mut printer, writer, *input_file)
36 InteractivePrinter::new(&self.config, &self.assets, *input_file, &mut reader);
37 self.print_file(reader, &mut printer, writer, *input_file)
40 if let Err(error) = result {
49 fn print_file<'a, P: Printer>(
51 reader: InputFileReader,
54 input_file: InputFile<'a>,
56 printer.print_header(writer, input_file)?;
57 self.print_file_ranges(printer, writer, reader, &self.config.line_range)?;
58 printer.print_footer(writer)?;
63 fn print_file_ranges<'a, P: Printer>(
67 mut reader: InputFileReader,
68 line_ranges: &Option<LineRange>,
70 let mut line_buffer = Vec::new();
72 let mut line_number: usize = 1;
74 while reader.read_line(&mut line_buffer)? {
77 if line_number < range.lower {
78 // Call the printer in case we need to call the syntax highlighter
79 // for this line. However, set `out_of_range` to `true`.
80 printer.print_line(true, writer, line_number, &line_buffer)?;
81 } else if line_number > range.upper {
82 // no more lines in range, exit early
85 printer.print_line(false, writer, line_number, &line_buffer)?;
89 printer.print_line(false, writer, line_number, &line_buffer)?;
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list