other: take ownership of config and matches when building App (#1215)

The clap matches/config struct was taken in as a reference when building
the App structure. However, we do not need to keep these around after
this, so we can instead take ownership of the match/config and drop it
after to save a bit of memory.
This commit is contained in:
Clement Tsang 2023-06-19 05:47:57 +00:00 committed by GitHub
parent 594e091a93
commit 751abecfe3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 19 deletions

View File

@ -5,7 +5,7 @@ use std::{
use clap_complete::{generate_to, shells::Shell}; use clap_complete::{generate_to, shells::Shell};
include!("src/clap.rs"); include!("src/args.rs");
fn create_dir(dir: &Path) -> io::Result<()> { fn create_dir(dir: &Path) -> io::Result<()> {
let res = fs::create_dir_all(dir); let res = fs::create_dir_all(dir);

View File

@ -34,7 +34,8 @@ use bottom::{
fn main() -> Result<()> { fn main() -> Result<()> {
// let _profiler = dhat::Profiler::new_heap(); // let _profiler = dhat::Profiler::new_heap();
let matches = clap::get_matches(); let matches = args::get_matches();
#[cfg(feature = "logging")] #[cfg(feature = "logging")]
{ {
if let Err(err) = if let Err(err) =
@ -45,10 +46,13 @@ fn main() -> Result<()> {
} }
// Read from config file. // Read from config file.
let config_path = read_config(matches.get_one::<String>("config_location")) let config = {
.context("Unable to access the given config file location.")?; let config_path = read_config(matches.get_one::<String>("config_location"))
let mut config: Config = create_or_get_config(&config_path) .context("Unable to access the given config file location.")?;
.context("Unable to properly parse or create the config file.")?;
create_or_get_config(&config_path)
.context("Unable to properly parse or create the config file.")?
};
// Get widget layout separately // Get widget layout separately
let (widget_layout, default_widget_id, default_widget_type_option) = let (widget_layout, default_widget_id, default_widget_type_option) =
@ -63,8 +67,8 @@ fn main() -> Result<()> {
// Create an "app" struct, which will control most of the program and store settings/state // Create an "app" struct, which will control most of the program and store settings/state
let mut app = build_app( let mut app = build_app(
&matches, matches,
&mut config, config,
&widget_layout, &widget_layout,
default_widget_id, default_widget_id,
&default_widget_type_option, &default_widget_type_option,

View File

@ -52,8 +52,8 @@ pub mod utils {
pub mod gen_util; pub mod gen_util;
pub mod logging; pub mod logging;
} }
pub mod args;
pub mod canvas; pub mod canvas;
pub mod clap;
pub mod components; pub mod components;
pub mod constants; pub mod constants;
pub mod data_conversion; pub mod data_conversion;

View File

@ -171,12 +171,15 @@ macro_rules! is_flag_enabled {
} }
pub fn build_app( pub fn build_app(
matches: &ArgMatches, config: &mut Config, widget_layout: &BottomLayout, matches: ArgMatches, config: Config, widget_layout: &BottomLayout, default_widget_id: u64,
default_widget_id: u64, default_widget_type_option: &Option<BottomWidgetType>, default_widget_type_option: &Option<BottomWidgetType>, styling: &CanvasStyling,
styling: &CanvasStyling,
) -> Result<App> { ) -> Result<App> {
use BottomWidgetType::*; use BottomWidgetType::*;
// Since everything takes a reference, but we want to take ownership here to drop matches/config later...
let matches = &matches;
let config = &config;
let retention_ms = let retention_ms =
get_retention_ms(matches, config).context("Update `retention` in your config file.")?; get_retention_ms(matches, config).context("Update `retention` in your config file.")?;
let autohide_time = is_flag_enabled!(autohide_time, matches, config); let autohide_time = is_flag_enabled!(autohide_time, matches, config);
@ -911,7 +914,7 @@ mod test {
#[test] #[test]
fn matches_human_times() { fn matches_human_times() {
let config = Config::default(); let config = Config::default();
let app = crate::clap::build_app(); let app = crate::args::build_app();
{ {
let app = app.clone(); let app = app.clone();
@ -938,7 +941,7 @@ mod test {
#[test] #[test]
fn matches_number_times() { fn matches_number_times() {
let config = Config::default(); let config = Config::default();
let app = crate::clap::build_app(); let app = crate::args::build_app();
{ {
let app = app.clone(); let app = app.clone();
@ -964,7 +967,7 @@ mod test {
#[test] #[test]
fn config_human_times() { fn config_human_times() {
let app = crate::clap::build_app(); let app = crate::args::build_app();
let matches = app.get_matches_from(["btm"]); let matches = app.get_matches_from(["btm"]);
let mut config = Config::default(); let mut config = Config::default();
@ -989,7 +992,7 @@ mod test {
#[test] #[test]
fn config_number_times() { fn config_number_times() {
let app = crate::clap::build_app(); let app = crate::args::build_app();
let matches = app.get_matches_from(["btm"]); let matches = app.get_matches_from(["btm"]);
let mut config = Config::default(); let mut config = Config::default();
@ -1012,19 +1015,19 @@ mod test {
); );
} }
fn create_app(mut config: Config, matches: ArgMatches) -> App { fn create_app(config: Config, matches: ArgMatches) -> App {
let (layout, id, ty) = get_widget_layout(&matches, &config).unwrap(); let (layout, id, ty) = get_widget_layout(&matches, &config).unwrap();
let styling = let styling =
CanvasStyling::new(get_color_scheme(&matches, &config).unwrap(), &config).unwrap(); CanvasStyling::new(get_color_scheme(&matches, &config).unwrap(), &config).unwrap();
super::build_app(&matches, &mut config, &layout, id, &ty, &styling).unwrap() super::build_app(matches, config, &layout, id, &ty, &styling).unwrap()
} }
// TODO: There's probably a better way to create clap options AND unify together to avoid the possibility of // TODO: There's probably a better way to create clap options AND unify together to avoid the possibility of
// typos/mixing up. Use proc macros to unify on one struct? // typos/mixing up. Use proc macros to unify on one struct?
#[test] #[test]
fn verify_cli_options_build() { fn verify_cli_options_build() {
let app = crate::clap::build_app(); let app = crate::args::build_app();
let default_app = { let default_app = {
let app = app.clone(); let app = app.clone();