mirror of
https://github.com/orhun/systeroid
synced 2024-07-23 11:24:57 +00:00
perf(cli): parse the documentation only once for multiple parameters
This commit is contained in:
parent
d65f8f63e7
commit
ace15e10e8
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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(¶m, args.kernel_docs.as_ref())?;
|
app.display_documentation(¶m)?;
|
||||||
}
|
}
|
||||||
} else if args.preload_files {
|
} else if args.preload_files {
|
||||||
for file in args.values {
|
for file in args.values {
|
||||||
|
|
Loading…
Reference in a new issue