on master help sign in
Restructure and fix bug in line range module
commitfedd32173e58002dfd5da6ba7ec156a74121c3ff authorsharkdp <davidpeter@web.de> dateSat 21 Mar 2020, 17:22 (7 years ago) parent4855a47
4 files changed+61−19
src/bin/bat/app.rs+9−7 src/lib.rs+17−3 src/line_range.rs+34−8 src/printer.rs+1−1
src/bin/bat/app.rs+9−7
@@ -20,7 +20,7 @@ use bat::{
2020 assets::BAT_THEME_DEFAULT,
2121 errors::*,
2222 inputfile::InputFile,
23− line_range::{LineRange, LineRanges},
23+ line_range::{HighlightedLineRanges, LineRange, LineRanges},
2424 style::{OutputComponent, OutputComponents, OutputWrap},
2525 syntax_mapping::SyntaxMapping,
2626 Config, PagingMode,
@@ -201,13 +201,14 @@ impl App {
201201 }
202202 })
203203 .unwrap_or_else(|| String::from(BAT_THEME_DEFAULT)),
204− line_ranges: LineRanges::from(
204+ line_ranges:
205205 self.matches
206206 .values_of("line-range")
207207 .map(|vs| vs.map(LineRange::from).collect())
208208 .transpose()?
209− .unwrap_or_else(|| vec![]),
210− ),
209+ .map(LineRanges::from)
210+ .unwrap_or_default()
211+ ,
211212 output_components,
212213 syntax_mapping,
213214 pager: self.matches.value_of("pager"),
@@ -215,13 +216,14 @@ impl App {
215216 Some("always") => true,
216217 _ => false,
217218 },
218− highlight_lines: LineRanges::from(
219+ highlighted_lines:
219220 self.matches
220221 .values_of("highlight-line")
221222 .map(|ws| ws.map(LineRange::from).collect())
222223 .transpose()?
223− .unwrap_or_else(|| vec![LineRange { lower: 0, upper: 0 }]),
224− ),
224+ .map(LineRanges::from)
225+ .map(|lr| HighlightedLineRanges(lr))
226+ .unwrap_or_default()
225227 })
226228 }
227229
src/lib.rs+17−3
@@ -68,7 +68,7 @@ impl Default for PagingMode {
6868}
6969
7070use inputfile::InputFile;
71−use line_range::LineRanges;
71+use line_range::{LineRanges, HighlightedLineRanges};
7272use style::{OutputComponents, OutputWrap};
7373use syntax_mapping::SyntaxMapping;
7474
@@ -123,6 +123,20 @@ pub struct Config<'a> {
123123 /// Whether or not to use ANSI italics
124124 pub use_italic_text: bool,
125125
126− /// Lines to highlight
127− pub highlight_lines: LineRanges,
126+ /// Ranges of lines which should be highlighted with a special background color
127+ pub highlighted_lines: HighlightedLineRanges,
128+}
129+
130+#[test]
131+fn default_config_should_include_all_lines() {
132+ use line_range::RangeCheckResult;
133+
134+ assert_eq!(Config::default().line_ranges.check(17), RangeCheckResult::InRange);
135+}
136+
137+#[test]
138+fn default_config_should_highlight_no_lines() {
139+ use line_range::RangeCheckResult;
140+
141+ assert_ne!(Config::default().highlighted_lines.0.check(17), RangeCheckResult::InRange);
128142}
src/line_range.rs+34−8
@@ -111,13 +111,15 @@ pub struct LineRanges {
111111 largest_upper_bound: usize,
112112}
113113
114−impl Default for LineRanges {
115− fn default() -> Self {
116− LineRanges::from(vec![LineRange { lower: 0, upper: 0 }])
114+impl LineRanges {
115+ pub fn none() -> LineRanges {
116+ LineRanges::from(vec![])
117+ }
118+
119+ pub fn all() -> LineRanges {
120+ LineRanges::from(vec![LineRange::default()])
117121 }
118−}
119122
120−impl LineRanges {
121123 pub fn from(ranges: Vec<LineRange>) -> LineRanges {
122124 let largest_upper_bound = ranges
123125 .iter()
@@ -131,7 +133,7 @@ impl LineRanges {
131133 }
132134
133135 pub fn check(&self, line: usize) -> RangeCheckResult {
134− if self.ranges.is_empty() || self.ranges.iter().any(|r| r.is_inside(line)) {
136+ if self.ranges.iter().any(|r| r.is_inside(line)) {
135137 RangeCheckResult::InRange
136138 } else if line < self.largest_upper_bound {
137139 RangeCheckResult::BeforeOrBetweenRanges
@@ -141,6 +143,23 @@ impl LineRanges {
141143 }
142144}
143145
146+impl Default for LineRanges {
147+ fn default() -> Self {
148+ Self::all()
149+ }
150+}
151+
152+/// Similar to LineRanges, but "empty" by default
153+#[derive(Debug, Clone)]
154+pub struct HighlightedLineRanges(pub LineRanges);
155+
156+impl Default for HighlightedLineRanges {
157+ fn default() -> Self {
158+ HighlightedLineRanges(LineRanges::none())
159+ }
160+}
161+
162+
144163#[cfg(test)]
145164fn ranges(rs: &[&str]) -> LineRanges {
146165 LineRanges::from(rs.iter().map(|r| LineRange::from(r).unwrap()).collect())
@@ -189,8 +208,15 @@ fn test_ranges_open_high() {
189208}
190209
191210#[test]
192−fn test_ranges_empty() {
193− let ranges = ranges(&[]);
211+fn test_ranges_all() {
212+ let ranges = LineRanges::all();
194213
195214 assert_eq!(RangeCheckResult::InRange, ranges.check(1));
196215}
216+
217+#[test]
218+fn test_ranges_none() {
219+ let ranges = LineRanges::none();
220+
221+ assert_ne!(RangeCheckResult::InRange, ranges.check(1));
222+}
src/printer.rs+1−1
@@ -376,7 +376,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
376376
377377 // Line highlighting
378378 let highlight_this_line =
379− self.config.highlight_lines.check(line_number) == RangeCheckResult::InRange;
379+ self.config.highlighted_lines.0.check(line_number) == RangeCheckResult::InRange;
380380
381381 let background_color = self
382382 .background_color_highlight