on 753a124 help sign in
bat/examples/using_printer.rs
83 lines 2.7 kB history raw
1use bat::{
2 self,
3 assets::HighlightingAssets,
4 inputfile::InputFile,
5 line_range::{LineRange, LineRanges, RangeCheckResult},
6 output::OutputType,
7 printer::{InteractivePrinter, Printer},
8 style::{OutputComponent, OutputComponents},
9 Config,
10};
11use std::{collections::HashSet, io};
13fn main() -> bat::errors::Result<()> {
14 let assets = HighlightingAssets::new();
15 let mut config = Config {
16 term_width: 14, // must be greater than 13 to enable style=numbers
17 colored_output: true,
18 true_color: true,
19 line_ranges: LineRanges::from(vec![
20 LineRange::from("5:7")?,
21 LineRange::from("92:97")?,
22 LineRange::from("15:17")?,
23 ]),
24 output_components: OutputComponents(with_full_decorations()),
25 ..Default::default()
26 };
27 let mut add_file = |file: &'static str| config.files.push(InputFile::Ordinary(file));
29 add_file("build.rs");
31 let mut output_type = OutputType::from_mode(config.paging_mode, config.pager)?;
32 let writer = output_type.handle()?;
33 let stdin = io::stdin();
35 for input_file in &config.files {
36 let mut reader = input_file.get_reader(&stdin)?;
37 let mut printer = InteractivePrinter::new(&config, &assets, *input_file, &mut reader);
39 printer.print_header(writer, *input_file)?;
41 if !reader.first_line.is_empty() {
42 let mut line_buffer = Vec::new();
43 let mut line_number = 1;
44 let mut has_snip = true; // skip first line snip
46 while reader.read_line(&mut line_buffer)? {
47 match config.line_ranges.check(line_number) {
48 RangeCheckResult::OutsideRange => {
49 if !has_snip {
50 printer.print_snip(writer)?;
51 has_snip = true;
52 }
53 }
54 RangeCheckResult::InRange => {
55 printer.print_line(
56 /*out_of_range = */ false,
57 writer,
58 line_number,
59 &line_buffer,
60 )?;
61 has_snip = false;
62 }
63 RangeCheckResult::AfterLastRange => break,
64 }
66 line_number += 1;
67 line_buffer.clear();
68 }
69 }
71 printer.print_footer(writer)?;
72 }
74 Ok(())
77fn with_full_decorations() -> HashSet<OutputComponent> {
78 OutputComponent::Full
79 .components(Default::default())
80 .iter()
81 .cloned()
82 .collect()