Changes: * Bug fix - bat adds markers only when a file path is passed and it can use git2 on it. It doesn't add markers when bytes are passed. Hence, the code is adjusted accordingly. The sideeffect is files being opened multiple times and its content being unnecessarily loaded in memory. * Refactoring of the crate - Config is extracted to its struct file. Repetitive blocks of code are dried and nested conditionals are flattened.
111 lines
4.2 KiB
Rust
111 lines
4.2 KiB
Rust
use nu_protocol::Value;
|
|
|
|
pub struct Config {
|
|
pub term_width: usize,
|
|
pub tab_width: u64,
|
|
pub colored_output: bool,
|
|
pub true_color: bool,
|
|
pub header: bool,
|
|
pub line_numbers: bool,
|
|
pub grid: bool,
|
|
pub vcs_modification_markers: bool,
|
|
pub snip: bool,
|
|
pub wrapping_mode: bat::WrappingMode,
|
|
pub use_italics: bool,
|
|
pub paging_mode: bat::PagingMode,
|
|
pub pager: String,
|
|
pub line_ranges: bat::line_range::LineRanges,
|
|
// TODO: Not configurable
|
|
highlight_range: String,
|
|
// TODO: Not configurable
|
|
pub highlight_range_from: u64,
|
|
// TODO: Not configurable
|
|
pub highlight_range_to: u64,
|
|
pub theme: String,
|
|
}
|
|
|
|
impl From<&Value> for Config {
|
|
fn from(value: &Value) -> Self {
|
|
let mut config = Config::default();
|
|
|
|
for (idx, entry) in value.row_entries() {
|
|
match idx.as_ref() {
|
|
"term_width" => {
|
|
config.term_width = entry.as_u64().unwrap_or(config.term_width as u64) as usize;
|
|
}
|
|
"tab_width" => {
|
|
config.tab_width = entry.as_u64().unwrap_or(4_u64);
|
|
}
|
|
"colored_output" => config.colored_output = entry.as_bool().unwrap_or(true),
|
|
"true_color" => config.true_color = entry.as_bool().unwrap_or(true),
|
|
"header" => config.header = entry.as_bool().unwrap_or(true),
|
|
"line_numbers" => config.line_numbers = entry.as_bool().unwrap_or(true),
|
|
"grid" => config.grid = entry.as_bool().unwrap_or(true),
|
|
"vcs_modification_markers" => {
|
|
config.vcs_modification_markers = entry.as_bool().unwrap_or(true)
|
|
}
|
|
"snip" => config.snip = entry.as_bool().unwrap_or(true),
|
|
"wrapping_mode" => {
|
|
config.wrapping_mode = match entry.as_string() {
|
|
Ok(s) if s.to_lowercase() == "nowrapping" => {
|
|
bat::WrappingMode::NoWrapping(true)
|
|
}
|
|
Ok(s) if s.to_lowercase() == "character" => bat::WrappingMode::Character,
|
|
_ => bat::WrappingMode::NoWrapping(true),
|
|
}
|
|
}
|
|
"use_italics" => config.use_italics = entry.as_bool().unwrap_or(true),
|
|
"paging_mode" => {
|
|
config.paging_mode = match entry.as_string() {
|
|
Ok(s) if s.to_lowercase() == "always" => bat::PagingMode::Always,
|
|
Ok(s) if s.to_lowercase() == "never" => bat::PagingMode::Never,
|
|
Ok(s) if s.to_lowercase() == "quitifonescreen" => {
|
|
bat::PagingMode::QuitIfOneScreen
|
|
}
|
|
_ => bat::PagingMode::QuitIfOneScreen,
|
|
}
|
|
}
|
|
"pager" => config.pager = entry.as_string().unwrap_or_else(|_| "less".to_string()),
|
|
// TODO: not real sure what to do with this
|
|
"line_ranges" => config.line_ranges = bat::line_range::LineRanges::all(),
|
|
"highlight_range" => config.highlight_range = "0,0".into(),
|
|
"theme" => {
|
|
config.theme = value
|
|
.as_string()
|
|
.unwrap_or_else(|_| "OneDarkHalf".to_string())
|
|
}
|
|
_ => (),
|
|
}
|
|
}
|
|
|
|
config
|
|
}
|
|
}
|
|
|
|
impl Default for Config {
|
|
fn default() -> Self {
|
|
let (term_width, _) = term_size::dimensions().unwrap_or((80, 20));
|
|
|
|
Self {
|
|
term_width,
|
|
tab_width: 4,
|
|
colored_output: true,
|
|
true_color: true,
|
|
header: true,
|
|
line_numbers: true,
|
|
grid: true,
|
|
vcs_modification_markers: true,
|
|
snip: true,
|
|
wrapping_mode: bat::WrappingMode::NoWrapping(true),
|
|
use_italics: true,
|
|
paging_mode: bat::PagingMode::QuitIfOneScreen,
|
|
pager: "less".into(),
|
|
line_ranges: bat::line_range::LineRanges::all(),
|
|
highlight_range: "0.0".into(),
|
|
highlight_range_from: 0,
|
|
highlight_range_to: 0,
|
|
theme: "OneHalfDark".into(),
|
|
}
|
|
}
|
|
}
|