summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Knaack <davidkna@users.noreply.github.com>2021-01-20 19:01:49 +0100
committerGitHub <noreply@github.com>2021-01-20 19:01:49 +0100
commit8302a3ccb4f83ecea0cad834c05c9e6f003f128a (patch)
treece092e7e66199e6dd89547b89fd77c87f62f4ee9 /src
parentbb160d92079fb8f2f9f301159a54db0741aec41d (diff)
perf(custom): evaluate command lazily (#2173)
Diffstat (limited to 'src')
-rw-r--r--src/configs/custom.rs2
-rw-r--r--src/modules/custom.rs62
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;