diff options
author | Clement Tsang <34804052+ClementTsang@users.noreply.github.com> | 2024-01-18 18:46:00 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-18 18:46:00 -0500 |
commit | 975e3d776bad3d0111394ae7871b96c513b4f10c (patch) | |
tree | 4f72b09f40251d40fe26b3068a66e6b27c9508d7 /src | |
parent | be4fa27b84ada5400fece60e84ebff18f3ef7641 (diff) |
refactor: move some files around in prep for a future options refactor (#1393)
* some formatting
* refactor: move some files around in prep for a bigger config/options refactor
Diffstat (limited to 'src')
-rw-r--r-- | src/canvas/styling.rs | 10 | ||||
-rw-r--r-- | src/options.rs | 144 | ||||
-rw-r--r-- | src/options/colours.rs | 43 | ||||
-rw-r--r-- | src/options/config.rs | 81 | ||||
-rw-r--r-- | src/options/config/ignore_list.rs | 21 | ||||
-rw-r--r-- | src/options/config/layout.rs | 3 |
6 files changed, 157 insertions, 145 deletions
diff --git a/src/canvas/styling.rs b/src/canvas/styling.rs index dec1800f..88273352 100644 --- a/src/canvas/styling.rs +++ b/src/canvas/styling.rs @@ -1,14 +1,12 @@ +mod colour_utils; + use anyhow::Context; use colour_utils::*; use tui::style::{Color, Style}; use super::ColourScheme; -use crate::{ - constants::*, - options::{Config, ConfigColours}, - utils::error, -}; -mod colour_utils; +pub use crate::options::Config; +use crate::{constants::*, options::colours::ConfigColours, utils::error}; pub struct CanvasStyling { pub currently_selected_text_colour: Color, diff --git a/src/options.rs b/src/options.rs index 95c780f6..092d982d 100644 --- a/src/options.rs +++ b/src/options.rs @@ -3,10 +3,10 @@ // TODO: Break this apart or do something a bit smarter. pub mod args; +pub mod colours; pub mod config; use std::{ - borrow::Cow, convert::TryInto, str::FromStr, time::{Duration, Instant}, @@ -14,14 +14,14 @@ use std::{ use anyhow::{Context, Result}; use clap::ArgMatches; +pub use colours::ConfigColours; use hashbrown::{HashMap, HashSet}; use indexmap::IndexSet; use regex::Regex; -use serde::{Deserialize, Serialize}; #[cfg(feature = "battery")] use starship_battery::Manager; -use self::config::{cpu::CpuConfig, layout::Row, process_columns::ProcessConfig}; +use self::config::{layout::Row, IgnoreList, StringOrNum}; use crate::{ app::{filter::Filter, layout_manager::*, *}, canvas::{styling::CanvasStyling, ColourScheme}, @@ -33,139 +33,7 @@ use crate::{ }, widgets::*, }; - -#[derive(Clone, Debug, Default, Deserialize)] -pub struct Config { - pub flags: Option<ConfigFlags>, - pub colors: Option<ConfigColours>, - pub row: Option<Vec<Row>>, - pub disk_filter: Option<IgnoreList>, - pub mount_filter: Option<IgnoreList>, - pub temp_filter: Option<IgnoreList>, - pub net_filter: Option<IgnoreList>, - pub processes: Option<ProcessConfig>, - pub cpu: Option<CpuConfig>, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(untagged)] -enum StringOrNum { - String(String), - Num(u64), -} - -impl From<String> for StringOrNum { - fn from(value: String) -> Self { - StringOrNum::String(value) - } -} - -impl From<u64> for StringOrNum { - fn from(value: u64) -> Self { - StringOrNum::Num(value) - } -} - -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct ConfigFlags { - hide_avg_cpu: Option<bool>, - dot_marker: Option<bool>, - temperature_type: Option<String>, - rate: Option<StringOrNum>, - left_legend: Option<bool>, - current_usage: Option<bool>, - unnormalized_cpu: Option<bool>, - group_processes: Option<bool>, - case_sensitive: Option<bool>, - whole_word: Option<bool>, - regex: Option<bool>, - basic: Option<bool>, - default_time_value: Option<StringOrNum>, - time_delta: Option<StringOrNum>, - autohide_time: Option<bool>, - hide_time: Option<bool>, - default_widget_type: Option<String>, - default_widget_count: Option<u64>, - expanded_on_startup: Option<bool>, - use_old_network_legend: Option<bool>, - hide_table_gap: Option<bool>, - battery: Option<bool>, - disable_click: Option<bool>, - no_write: Option<bool>, - /// For built-in colour palettes. - color: Option<String>, - mem_as_value: Option<bool>, - tree: Option<bool>, - show_table_scroll_position: Option<bool>, - process_command: Option<bool>, - disable_advanced_kill: Option<bool>, - network_use_bytes: Option<bool>, - network_use_log: Option<bool>, - network_use_binary_prefix: Option<bool>, - enable_gpu: Option<bool>, - enable_cache_memory: Option<bool>, - retention: Option<StringOrNum>, -} - -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct ConfigColours { - pub table_header_color: Option<Cow<'static, str>>, - pub all_cpu_color: Option<Cow<'static, str>>, - pub avg_cpu_color: Option<Cow<'static, str>>, - pub cpu_core_colors: Option<Vec<Cow<'static, str>>>, - pub ram_color: Option<Cow<'static, str>>, - #[cfg(not(target_os = "windows"))] - pub cache_color: Option<Cow<'static, str>>, - pub swap_color: Option<Cow<'static, str>>, - pub arc_color: Option<Cow<'static, str>>, - pub gpu_core_colors: Option<Vec<Cow<'static, str>>>, - pub rx_color: Option<Cow<'static, str>>, - pub tx_color: Option<Cow<'static, str>>, - pub rx_total_color: Option<Cow<'static, str>>, // These only affect basic mode. - pub tx_total_color: Option<Cow<'static, str>>, // These only affect basic mode. - pub border_color: Option<Cow<'static, str>>, - pub highlighted_border_color: Option<Cow<'static, str>>, - pub disabled_text_color: Option<Cow<'static, str>>, - pub text_color: Option<Cow<'static, str>>, - pub selected_text_color: Option<Cow<'static, str>>, - pub selected_bg_color: Option<Cow<'static, str>>, - pub widget_title_color: Option<Cow<'static, str>>, - pub graph_color: Option<Cow<'static, str>>, - pub high_battery_color: Option<Cow<'static, str>>, - pub medium_battery_color: Option<Cow<'static, str>>, - pub low_battery_color: Option<Cow<'static, str>>, -} - -impl ConfigColours { - /// Returns `true` if there is a [`ConfigColours`] that is empty or there isn't one at all. - pub fn is_empty(&self) -> bool { - if let Ok(serialized_string) = toml_edit::ser::to_string(self) { - return serialized_string.is_empty(); - } - - true - } -} - -/// Workaround as per https://github.com/serde-rs/serde/issues/1030 -fn default_as_true() -> bool { - true -} - -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct IgnoreList { - #[serde(default = "default_as_true")] - // TODO: Deprecate and/or rename, current name sounds awful. - // Maybe to something like "deny_entries"? Currently it defaults to a denylist anyways, so maybe "allow_entries"? - pub is_list_ignored: bool, - pub list: Vec<String>, - #[serde(default = "bool::default")] - pub regex: bool, - #[serde(default = "bool::default")] - pub case_sensitive: bool, - #[serde(default = "bool::default")] - pub whole_word: bool, -} +pub use config::Config; macro_rules! is_flag_enabled { ($flag_name:ident, $matches:expr, $config:expr) => { @@ -261,6 +129,7 @@ pub fn init_app( } }; + // TODO: Can probably just reuse the options struct. let app_config_fields = AppConfigFields { update_rate: get_update_rate(matches, config) .context("Update 'rate' in your config file.")?, @@ -917,7 +786,8 @@ mod test { app::App, canvas::styling::CanvasStyling, options::{ - get_default_time_value, get_retention, get_update_rate, try_parse_ms, ConfigFlags, + config::ConfigFlags, get_default_time_value, get_retention, get_update_rate, + try_parse_ms, }, }; diff --git a/src/options/colours.rs b/src/options/colours.rs new file mode 100644 index 00000000..edef00b4 --- /dev/null +++ b/src/options/colours.rs @@ -0,0 +1,43 @@ +use std::borrow::Cow; + +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Default, Deserialize, Serialize)] +pub struct ConfigColours { + pub table_header_color: Option<Cow<'static, str>>, + pub all_cpu_color: Option<Cow<'static, str>>, + pub avg_cpu_color: Option<Cow<'static, str>>, + pub cpu_core_colors: Option<Vec<Cow<'static, str>>>, + pub ram_color: Option<Cow<'static, str>>, + #[cfg(not(target_os = "windows"))] + pub cache_color: Option<Cow<'static, str>>, + pub swap_color: Option<Cow<'static, str>>, + pub arc_color: Option<Cow<'static, str>>, + pub gpu_core_colors: Option<Vec<Cow<'static, str>>>, + pub rx_color: Option<Cow<'static, str>>, + pub tx_color: Option<Cow<'static, str>>, + pub rx_total_color: Option<Cow<'static, str>>, // These only affect basic mode. + pub tx_total_color: Option<Cow<'static, str>>, // These only affect basic mode. + pub border_color: Option<Cow<'static, str>>, + pub highlighted_border_color: Option<Cow<'static, str>>, + pub disabled_text_color: Option<Cow<'static, str>>, + pub text_color: Option<Cow<'static, str>>, + pub selected_text_color: Option<Cow<'static, str>>, + pub selected_bg_color: Option<Cow<'static, str>>, + pub widget_title_color: Option<Cow<'static, str>>, + pub graph_color: Option<Cow<'static, str>>, + pub high_battery_color: Option<Cow<'static, str>>, + pub medium_battery_color: Option<Cow<'static, str>>, + pub low_battery_color: Option<Cow<'static, str>>, +} + +impl ConfigColours { + /// Returns `true` if there is a [`ConfigColours`] that is empty or there isn't one at all. + pub fn is_empty(&self) -> bool { + if let Ok(serialized_string) = toml_edit::ser::to_string(self) { + return serialized_string.is_empty(); + } + + true + } +} diff --git a/src/options/config.rs b/src/options/config.rs index e76d867c..23c2f956 100644 --- a/src/options/config.rs +++ b/src/options/config.rs @@ -1,3 +1,84 @@ pub mod cpu; +mod ignore_list; pub mod layout; pub mod process_columns; + +use serde::{Deserialize, Serialize}; + +pub use self::ignore_list::IgnoreList; +use self::{cpu::CpuConfig, layout::Row, process_columns::ProcessConfig}; + +use super::ConfigColours; + +#[derive(Clone, Debug, Default, Deserialize)] +pub struct Config { + pub(crate) flags: Option<ConfigFlags>, + pub(crate) colors: Option<ConfigColours>, + pub(crate) row: Option<Vec<Row>>, + pub(crate) disk_filter: Option<IgnoreList>, + pub(crate) mount_filter: Option<IgnoreList>, + pub(crate) temp_filter: Option<IgnoreList>, + pub(crate) net_filter: Option<IgnoreList>, + pub(crate) processes: Option<ProcessConfig>, + pub(crate) cpu: Option<CpuConfig>, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(untagged)] +pub(crate) enum StringOrNum { + String(String), + Num(u64), +} + +impl From<String> for StringOrNum { + fn from(value: String) -> Self { + StringOrNum::String(value) + } +} + +impl From<u64> for StringOrNum { + fn from(value: u64) -> Self { + StringOrNum::Num(value) + } +} + +#[derive(Clone, Debug, Default, Deserialize, Serialize)] +pub(crate) struct ConfigFlags { + pub(crate) hide_avg_cpu: Option<bool>, + pub(crate) dot_marker: Option<bool>, + pub(crate) temperature_type: Option<String>, + pub(crate) rate: Option<StringOrNum>, + pub(crate) left_legend: Option<bool>, + pub(crate) current_usage: Option<bool>, + pub(crate) unnormalized_cpu: Option<bool>, + pub(crate) group_processes: Option<bool>, + pub(crate) case_sensitive: Option<bool>, + pub(crate) whole_word: Option<bool>, + pub(crate) regex: Option<bool>, + pub(crate) basic: Option<bool>, + pub(crate) default_time_value: Option<StringOrNum>, + pub(crate) time_delta: Option<StringOrNum>, + pub(crate) autohide_time: Option<bool>, + pub(crate) hide_time: Option<bool>, + pub(crate) default_widget_type: Option<String>, + pub(crate) default_widget_count: Option<u64>, + pub(crate) expanded_on_startup: Option<bool>, + pub(crate) use_old_network_legend: Option<bool>, + pub(crate) hide_table_gap: Option<bool>, + pub(crate) battery: Option<bool>, + pub(crate) disable_click: Option<bool>, + pub(crate) no_write: Option<bool>, + /// For built-in colour palettes. + pub(crate) color: Option<String>, + pub(crate) mem_as_value: Option<bool>, + pub(crate) tree: Option<bool>, + pub(crate) show_table_scroll_position: Option<bool>, + pub(crate) process_command: Option<bool>, + pub(crate) disable_advanced_kill: Option<bool>, + pub(crate) network_use_bytes: Option<bool>, + pub(crate) network_use_log: Option<bool>, + pub(crate) network_use_binary_prefix: Option<bool>, + pub(crate) enable_gpu: Option<bool>, + pub(crate) enable_cache_memory: Option<bool>, + pub(crate) retention: Option<StringOrNum>, +} diff --git a/src/options/config/ignore_list.rs b/src/options/config/ignore_list.rs new file mode 100644 index 00000000..d70224c1 --- /dev/null +++ b/src/options/config/ignore_list.rs @@ -0,0 +1,21 @@ +use serde::{Deserialize, Serialize}; + +/// Workaround as per https://github.com/serde-rs/serde/issues/1030 +fn default_as_true() -> bool { + true +} + +#[derive(Clone, Debug, Default, Deserialize, Serialize)] +pub struct IgnoreList { + #[serde(default = "default_as_true")] + // TODO: Deprecate and/or rename, current name sounds awful. + // Maybe to something like "deny_entries"? Currently it defaults to a denylist anyways, so maybe "allow_entries"? + pub is_list_ignored: bool, + pub list: Vec<String>, + #[serde(default)] + pub regex: bool, + #[serde(default)] + pub case_sensitive: bool, + #[serde(default)] + pub whole_word: bool, +} diff --git a/src/options/config/layout.rs b/src/options/config/layout.rs index cfb1d705..90467e11 100644 --- a/src/options/config/layout.rs +++ b/src/options/config/layout.rs @@ -235,14 +235,13 @@ pub struct FinalWidget { mod test { use toml_edit::de::from_str; + use super::*; use crate::{ constants::{DEFAULT_LAYOUT, DEFAULT_WIDGET_ID}, options::Config, utils::error, }; - use super::*; - const PROC_LAYOUT: &str = r#" [[row]] [[row.child]] |