112 lines
3.8 KiB
Rust
112 lines
3.8 KiB
Rust
pub use nu_data::config::NuConfig;
|
|
use nu_data::primitive::lookup_ansi_color_style;
|
|
use nu_protocol::Value;
|
|
use nu_table::{Alignment, TextStyle};
|
|
use std::fmt::Debug;
|
|
|
|
pub trait ConfigExtensions: Debug + Send {
|
|
fn table_mode(&self) -> nu_table::Theme;
|
|
fn disabled_indexes(&self) -> bool;
|
|
fn header_style(&self) -> TextStyle;
|
|
}
|
|
|
|
pub fn header_alignment_from_value(align_value: Option<&Value>) -> nu_table::Alignment {
|
|
match align_value {
|
|
Some(v) => match v
|
|
.as_string()
|
|
.unwrap_or_else(|_| "none".to_string())
|
|
.as_ref()
|
|
{
|
|
"l" | "left" => nu_table::Alignment::Left,
|
|
"c" | "center" => nu_table::Alignment::Center,
|
|
"r" | "right" => nu_table::Alignment::Right,
|
|
_ => nu_table::Alignment::Center,
|
|
},
|
|
_ => nu_table::Alignment::Center,
|
|
}
|
|
}
|
|
|
|
pub fn get_color_from_key_and_subkey(config: &NuConfig, key: &str, subkey: &str) -> Option<Value> {
|
|
let vars = &config.vars;
|
|
|
|
if let Some(config_vars) = vars.get(key) {
|
|
for (kee, value) in config_vars.row_entries() {
|
|
if kee == subkey {
|
|
return Some(value.clone());
|
|
}
|
|
}
|
|
}
|
|
|
|
None
|
|
}
|
|
|
|
pub fn header_bold_from_value(bold_value: Option<&Value>) -> bool {
|
|
bold_value
|
|
.map(|x| x.as_bool().unwrap_or(true))
|
|
.unwrap_or(true)
|
|
}
|
|
|
|
pub fn table_mode(config: &NuConfig) -> nu_table::Theme {
|
|
let vars = &config.vars;
|
|
|
|
vars.get("table_mode")
|
|
.map_or(nu_table::Theme::compact(), |mode| match mode.as_string() {
|
|
Ok(m) if m == "basic" => nu_table::Theme::basic(),
|
|
Ok(m) if m == "compact" => nu_table::Theme::compact(),
|
|
Ok(m) if m == "light" => nu_table::Theme::light(),
|
|
Ok(m) if m == "thin" => nu_table::Theme::thin(),
|
|
Ok(m) if m == "with_love" => nu_table::Theme::with_love(),
|
|
Ok(m) if m == "compact_double" => nu_table::Theme::compact_double(),
|
|
Ok(m) if m == "rounded" => nu_table::Theme::rounded(),
|
|
Ok(m) if m == "reinforced" => nu_table::Theme::reinforced(),
|
|
Ok(m) if m == "heavy" => nu_table::Theme::heavy(),
|
|
Ok(m) if m == "none" => nu_table::Theme::none(),
|
|
_ => nu_table::Theme::compact(),
|
|
})
|
|
}
|
|
|
|
pub fn disabled_indexes(config: &NuConfig) -> bool {
|
|
let vars = &config.vars;
|
|
|
|
vars.get("disable_table_indexes")
|
|
.map_or(false, |x| x.as_bool().unwrap_or(false))
|
|
}
|
|
|
|
impl ConfigExtensions for NuConfig {
|
|
fn header_style(&self) -> TextStyle {
|
|
// FIXME: I agree, this is the long way around, please suggest and alternative.
|
|
let head_color = get_color_from_key_and_subkey(self, "color_config", "header_color");
|
|
let head_color_style = match head_color {
|
|
Some(s) => {
|
|
lookup_ansi_color_style(s.as_string().unwrap_or_else(|_| "green".to_string()))
|
|
}
|
|
None => nu_ansi_term::Color::Green.normal(),
|
|
};
|
|
let head_bold = get_color_from_key_and_subkey(self, "color_config", "header_bold");
|
|
let head_bold_bool = match head_bold {
|
|
Some(b) => header_bold_from_value(Some(&b)),
|
|
None => true,
|
|
};
|
|
let head_align = get_color_from_key_and_subkey(self, "color_config", "header_align");
|
|
let head_alignment = match head_align {
|
|
Some(a) => header_alignment_from_value(Some(&a)),
|
|
None => Alignment::Center,
|
|
};
|
|
|
|
TextStyle::new()
|
|
.alignment(head_alignment)
|
|
.bold(Some(head_bold_bool))
|
|
.fg(head_color_style
|
|
.foreground
|
|
.unwrap_or(nu_ansi_term::Color::Green))
|
|
}
|
|
|
|
fn table_mode(&self) -> nu_table::Theme {
|
|
table_mode(self)
|
|
}
|
|
|
|
fn disabled_indexes(&self) -> bool {
|
|
disabled_indexes(self)
|
|
}
|
|
}
|