nushell/crates/nu_plugin_textview/src/config.rs
Tomas Koutsky 8b193db0cb
Fix VCS markers not showing up in textview (#3530)
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.
2021-06-03 18:25:28 +12:00

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(),
}
}
}