@@ -0,0 +1,84 @@
1+use 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+};
11+use std::{collections::HashSet, io};
12+
13+fn 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));
28+
29+ // add_file("Cargo.toml");
30+ add_file("build.rs");
31+
32+ let mut output_type = OutputType::from_mode(config.paging_mode, config.pager)?;
33+ let writer = output_type.handle()?;
34+ let stdin = io::stdin();
35+
36+ for input_file in &config.files {
37+ let mut reader = input_file.get_reader(&stdin)?;
38+ let mut printer = InteractivePrinter::new(&config, &assets, *input_file, &mut reader);
39+
40+ printer.print_header(writer, *input_file)?;
41+
42+ if !reader.first_line.is_empty() {
43+ let mut line_buffer = Vec::new();
44+ let mut line_number = 1;
45+ let mut has_snip = true; // skip first line snip
46+
47+ while reader.read_line(&mut line_buffer)? {
48+ match config.line_ranges.check(line_number) {
49+ RangeCheckResult::OutsideRange => {
50+ if !has_snip {
51+ printer.print_snip(writer)?;
52+ has_snip = true;
53+ }
54+ }
55+ RangeCheckResult::InRange => {
56+ printer.print_line(
57+ /*out_of_range = */ false,
58+ writer,
59+ line_number,
60+ &line_buffer,
61+ )?;
62+ has_snip = false;
63+ }
64+ RangeCheckResult::AfterLastRange => break,
65+ }
66+
67+ line_number += 1;
68+ line_buffer.clear();
69+ }
70+ }
71+
72+ printer.print_footer(writer)?;
73+ }
74+
75+ Ok(())
76+}
77+
78+fn with_full_decorations() -> HashSet<OutputComponent> {
79+ OutputComponent::Full
80+ .components(Default::default())
81+ .iter()
82+ .cloned()
83+ .collect()
84+}