From ace15e10e805fb6a1c8f13123010f2f993655b65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orhun=20Parmaks=C4=B1z?= Date: Sun, 17 Apr 2022 17:36:05 +0300 Subject: [PATCH] perf(cli): parse the documentation only once for multiple parameters --- systeroid/src/app.rs | 29 +++++++++-------------------- systeroid/src/lib.rs | 8 ++++++-- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/systeroid/src/app.rs b/systeroid/src/app.rs index 67349aa..3d6c706 100644 --- a/systeroid/src/app.rs +++ b/systeroid/src/app.rs @@ -3,7 +3,6 @@ use std::env; use std::io::{self, BufRead, Write}; use std::path::PathBuf; use std::process::{Command, Stdio}; -use systeroid_core::cache::Cache; use systeroid_core::error::Result; use systeroid_core::parseit::globwalk; use systeroid_core::parseit::reader; @@ -18,8 +17,6 @@ use systeroid_core::tree::{Tree, TreeNode}; pub struct App<'a, Output: Write> { /// Sysctl controller. sysctl: &'a mut Sysctl, - /// Application cache. - cache: Cache, /// Standard output. output: &'a mut Output, /// Output type. @@ -28,17 +25,12 @@ pub struct App<'a, Output: Write> { impl<'a, Output: Write> App<'a, Output> { /// Constructs a new instance. - pub fn new( - sysctl: &'a mut Sysctl, - output: &'a mut Output, - output_type: OutputType, - ) -> Result { - Ok(Self { + pub fn new(sysctl: &'a mut Sysctl, output: &'a mut Output, output_type: OutputType) -> Self { + Self { sysctl, - cache: Cache::init()?, output, output_type, - }) + } } /// Prints the given parameters to stdout. @@ -93,13 +85,7 @@ impl<'a, Output: Write> App<'a, Output> { } /// Displays the documentation of a parameter. - pub fn display_documentation( - &mut self, - param_name: &str, - kernel_docs: Option<&PathBuf>, - ) -> Result<()> { - self.sysctl - .update_docs_from_cache(kernel_docs, &self.cache)?; + pub fn display_documentation(&mut self, param_name: &str) -> Result<()> { let no_pager = self.sysctl.config.no_pager; for parameter in self.sysctl.get_parameters(param_name) { let mut fallback_to_default = false; @@ -242,6 +228,7 @@ impl<'a, Output: Write> App<'a, Output> { #[cfg(test)] mod tests { use super::*; + use systeroid_core::cache::Cache; use systeroid_core::config::Config; #[test] @@ -251,7 +238,9 @@ mod tests { no_pager: true, ..Config::default() })?; - let mut app = App::new(&mut sysctl, &mut output, OutputType::Default)?; + sysctl.update_docs_from_cache(None, &Cache::init()?)?; + + let mut app = App::new(&mut sysctl, &mut output, OutputType::Default); app.display_parameters(Regex::new("kernel|vm").ok(), false)?; let result = String::from_utf8_lossy(app.output); @@ -264,7 +253,7 @@ mod tests { assert!(String::from_utf8_lossy(app.output).contains("─ osrelease =")); app.output.clear(); - app.display_documentation("kernel.acct", None)?; + app.display_documentation("kernel.acct")?; assert!(String::from_utf8_lossy(app.output).contains("highwater lowwater frequency")); app.output.clear(); diff --git a/systeroid/src/lib.rs b/systeroid/src/lib.rs index c42f7fb..1ca8d76 100644 --- a/systeroid/src/lib.rs +++ b/systeroid/src/lib.rs @@ -13,6 +13,7 @@ use crate::app::App; use crate::args::Args; use std::io::Write; use std::path::PathBuf; +use systeroid_core::cache::Cache; use systeroid_core::config::Config; use systeroid_core::error::Result; use systeroid_core::sysctl::controller::Sysctl; @@ -28,7 +29,10 @@ pub fn run(args: Args, output: &mut Output) -> Result<()> { ..Default::default() }; let mut sysctl = Sysctl::init(config)?; - let mut app = App::new(&mut sysctl, output, args.output_type)?; + if args.explain { + sysctl.update_docs_from_cache(args.kernel_docs.as_ref(), &Cache::init()?)?; + } + let mut app = App::new(&mut sysctl, output, args.output_type); if args.preload_system_files { app.preload_from_system()?; @@ -36,7 +40,7 @@ pub fn run(args: Args, output: &mut Output) -> Result<()> { app.display_parameters(args.pattern, args.display_deprecated)?; } else if args.explain { for param in args.values { - app.display_documentation(¶m, args.kernel_docs.as_ref())?; + app.display_documentation(¶m)?; } } else if args.preload_files { for file in args.values {