diff options
author | David Knaack <davidkna@users.noreply.github.com> | 2021-01-20 19:01:49 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-20 19:01:49 +0100 |
commit | 8302a3ccb4f83ecea0cad834c05c9e6f003f128a (patch) | |
tree | ce092e7e66199e6dd89547b89fd77c87f62f4ee9 /src | |
parent | bb160d92079fb8f2f9f301159a54db0741aec41d (diff) |
perf(custom): evaluate command lazily (#2173)
Diffstat (limited to 'src')
-rw-r--r-- | src/configs/custom.rs | 2 | ||||
-rw-r--r-- | src/modules/custom.rs | 62 |
2 files changed, 33 insertions, 31 deletions
diff --git a/src/configs/custom.rs b/src/configs/custom.rs index 315542b21..69e778190 100644 --- a/src/configs/custom.rs +++ b/src/configs/custom.rs @@ -29,7 +29,7 @@ pub struct CustomConfig<'a> { impl<'a> RootModuleConfig<'a> for CustomConfig<'a> { fn new() -> Self { CustomConfig { - format: "[$symbol$output]($style) ", + format: "[$symbol($output )]($style)", symbol: "", command: "", when: None, diff --git a/src/modules/custom.rs b/src/modules/custom.rs index d72a874b4..19959ed72 100644 --- a/src/modules/custom.rs +++ b/src/modules/custom.rs @@ -46,36 +46,38 @@ pub fn module<'a>(name: &str, context: &'a Context) -> Option<Module<'a>> { let mut module = Module::new(name, config.description, Some(toml_config)); - let output = exec_command(config.command, &config.shell.0)?; - - let trimmed = output.trim(); - if !trimmed.is_empty() { - let parsed = StringFormatter::new(config.format).and_then(|formatter| { - formatter - .map_meta(|var, _| match var { - "symbol" => Some(config.symbol), - _ => None, - }) - .map_style(|variable| match variable { - "style" => Some(Ok(config.style)), - _ => None, - }) - .map(|variable| match variable { - // This may result in multiple calls to `get_module_version` when a user have - // multiple `$version` variables defined in `format`. - "output" => Some(Ok(trimmed)), - _ => None, - }) - .parse(None) - }); - - match parsed { - Ok(segments) => module.set_segments(segments), - Err(error) => { - log::warn!("Error in module `custom.{}`:\n{}", name, error); - } - }; - } + let parsed = StringFormatter::new(config.format).and_then(|formatter| { + formatter + .map_meta(|var, _| match var { + "symbol" => Some(config.symbol), + _ => None, + }) + .map_style(|variable| match variable { + "style" => Some(Ok(config.style)), + _ => None, + }) + .map(|variable| match variable { + "output" => { + let output = exec_command(config.command, &config.shell.0)?; + let trimmed = output.trim(); + + if trimmed.is_empty() { + None + } else { + Some(Ok(trimmed.to_string())) + } + } + _ => None, + }) + .parse(None) + }); + + match parsed { + Ok(segments) => module.set_segments(segments), + Err(error) => { + log::warn!("Error in module `custom.{}`:\n{}", name, error); + } + }; let elapsed = start.elapsed(); log::trace!("Took {:?} to compute custom module {:?}", elapsed, name); module.duration = elapsed; |