perf(cli): parse the documentation only once for multiple parameters

This commit is contained in:
Orhun Parmaksız 2022-04-17 17:36:05 +03:00
parent d65f8f63e7
commit ace15e10e8
No known key found for this signature in database
GPG key ID: F83424824B3E4B90
2 changed files with 15 additions and 22 deletions

View file

@ -3,7 +3,6 @@ use std::env;
use std::io::{self, BufRead, Write}; use std::io::{self, BufRead, Write};
use std::path::PathBuf; use std::path::PathBuf;
use std::process::{Command, Stdio}; use std::process::{Command, Stdio};
use systeroid_core::cache::Cache;
use systeroid_core::error::Result; use systeroid_core::error::Result;
use systeroid_core::parseit::globwalk; use systeroid_core::parseit::globwalk;
use systeroid_core::parseit::reader; use systeroid_core::parseit::reader;
@ -18,8 +17,6 @@ use systeroid_core::tree::{Tree, TreeNode};
pub struct App<'a, Output: Write> { pub struct App<'a, Output: Write> {
/// Sysctl controller. /// Sysctl controller.
sysctl: &'a mut Sysctl, sysctl: &'a mut Sysctl,
/// Application cache.
cache: Cache,
/// Standard output. /// Standard output.
output: &'a mut Output, output: &'a mut Output,
/// Output type. /// Output type.
@ -28,17 +25,12 @@ pub struct App<'a, Output: Write> {
impl<'a, Output: Write> App<'a, Output> { impl<'a, Output: Write> App<'a, Output> {
/// Constructs a new instance. /// Constructs a new instance.
pub fn new( pub fn new(sysctl: &'a mut Sysctl, output: &'a mut Output, output_type: OutputType) -> Self {
sysctl: &'a mut Sysctl, Self {
output: &'a mut Output,
output_type: OutputType,
) -> Result<Self> {
Ok(Self {
sysctl, sysctl,
cache: Cache::init()?,
output, output,
output_type, output_type,
}) }
} }
/// Prints the given parameters to stdout. /// Prints the given parameters to stdout.
@ -93,13 +85,7 @@ impl<'a, Output: Write> App<'a, Output> {
} }
/// Displays the documentation of a parameter. /// Displays the documentation of a parameter.
pub fn display_documentation( pub fn display_documentation(&mut self, param_name: &str) -> Result<()> {
&mut self,
param_name: &str,
kernel_docs: Option<&PathBuf>,
) -> Result<()> {
self.sysctl
.update_docs_from_cache(kernel_docs, &self.cache)?;
let no_pager = self.sysctl.config.no_pager; let no_pager = self.sysctl.config.no_pager;
for parameter in self.sysctl.get_parameters(param_name) { for parameter in self.sysctl.get_parameters(param_name) {
let mut fallback_to_default = false; let mut fallback_to_default = false;
@ -242,6 +228,7 @@ impl<'a, Output: Write> App<'a, Output> {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use systeroid_core::cache::Cache;
use systeroid_core::config::Config; use systeroid_core::config::Config;
#[test] #[test]
@ -251,7 +238,9 @@ mod tests {
no_pager: true, no_pager: true,
..Config::default() ..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)?; app.display_parameters(Regex::new("kernel|vm").ok(), false)?;
let result = String::from_utf8_lossy(app.output); let result = String::from_utf8_lossy(app.output);
@ -264,7 +253,7 @@ mod tests {
assert!(String::from_utf8_lossy(app.output).contains("─ osrelease =")); assert!(String::from_utf8_lossy(app.output).contains("─ osrelease ="));
app.output.clear(); 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")); assert!(String::from_utf8_lossy(app.output).contains("highwater lowwater frequency"));
app.output.clear(); app.output.clear();

View file

@ -13,6 +13,7 @@ use crate::app::App;
use crate::args::Args; use crate::args::Args;
use std::io::Write; use std::io::Write;
use std::path::PathBuf; use std::path::PathBuf;
use systeroid_core::cache::Cache;
use systeroid_core::config::Config; use systeroid_core::config::Config;
use systeroid_core::error::Result; use systeroid_core::error::Result;
use systeroid_core::sysctl::controller::Sysctl; use systeroid_core::sysctl::controller::Sysctl;
@ -28,7 +29,10 @@ pub fn run<Output: Write>(args: Args, output: &mut Output) -> Result<()> {
..Default::default() ..Default::default()
}; };
let mut sysctl = Sysctl::init(config)?; 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 { if args.preload_system_files {
app.preload_from_system()?; app.preload_from_system()?;
@ -36,7 +40,7 @@ pub fn run<Output: Write>(args: Args, output: &mut Output) -> Result<()> {
app.display_parameters(args.pattern, args.display_deprecated)?; app.display_parameters(args.pattern, args.display_deprecated)?;
} else if args.explain { } else if args.explain {
for param in args.values { for param in args.values {
app.display_documentation(&param, args.kernel_docs.as_ref())?; app.display_documentation(&param)?;
} }
} else if args.preload_files { } else if args.preload_files {
for file in args.values { for file in args.values {