mirror of
https://github.com/starship/starship.git
synced 2025-06-20 09:58:26 +02:00
perf(custom): evaluate command lazily (#2173)
This commit is contained in:
parent
bb160d9207
commit
8302a3ccb4
@ -2559,18 +2559,18 @@ If you have an interesting example not covered there, feel free to share it ther
|
|||||||
### Options
|
### Options
|
||||||
|
|
||||||
| Option | Default | Description |
|
| Option | Default | Description |
|
||||||
| ------------- | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
| ------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| `command` | | The command whose output should be printed. The command will be passed on stdin to the shell. |
|
| `command` | | The command whose output should be printed. The command will be passed on stdin to the shell. |
|
||||||
| `when` | | A shell command used as a condition to show the module. The module will be shown if the command returns a `0` status code. |
|
| `when` | | A shell command used as a condition to show the module. The module will be shown if the command returns a `0` status code. |
|
||||||
| `shell` | | [See below](#custom-command-shell) |
|
| `shell` | | [See below](#custom-command-shell) |
|
||||||
| `description` | `"<custom module>"` | The description of the module that is shown when running `starship explain`. |
|
| `description` | `"<custom module>"` | The description of the module that is shown when running `starship explain`. |
|
||||||
| `files` | `[]` | The files that will be searched in the working directory for a match. |
|
| `files` | `[]` | The files that will be searched in the working directory for a match. |
|
||||||
| `directories` | `[]` | The directories that will be searched in the working directory for a match. |
|
| `directories` | `[]` | The directories that will be searched in the working directory for a match. |
|
||||||
| `extensions` | `[]` | The extensions that will be searched in the working directory for a match. |
|
| `extensions` | `[]` | The extensions that will be searched in the working directory for a match. |
|
||||||
| `symbol` | `""` | The symbol used before displaying the command output. |
|
| `symbol` | `""` | The symbol used before displaying the command output. |
|
||||||
| `style` | `"bold green"` | The style for the module. |
|
| `style` | `"bold green"` | The style for the module. |
|
||||||
| `format` | `"[$symbol$output]($style) "` | The format for the module. |
|
| `format` | `"[$symbol($output )]($style)"` | The format for the module. |
|
||||||
| `disabled` | `false` | Disables this `custom` module. |
|
| `disabled` | `false` | Disables this `custom` module. |
|
||||||
|
|
||||||
### Variables
|
### Variables
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ pub struct CustomConfig<'a> {
|
|||||||
impl<'a> RootModuleConfig<'a> for CustomConfig<'a> {
|
impl<'a> RootModuleConfig<'a> for CustomConfig<'a> {
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
CustomConfig {
|
CustomConfig {
|
||||||
format: "[$symbol$output]($style) ",
|
format: "[$symbol($output )]($style)",
|
||||||
symbol: "",
|
symbol: "",
|
||||||
command: "",
|
command: "",
|
||||||
when: None,
|
when: None,
|
||||||
|
@ -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 mut module = Module::new(name, config.description, Some(toml_config));
|
||||||
|
|
||||||
let output = exec_command(config.command, &config.shell.0)?;
|
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();
|
||||||
|
|
||||||
let trimmed = output.trim();
|
if trimmed.is_empty() {
|
||||||
if !trimmed.is_empty() {
|
None
|
||||||
let parsed = StringFormatter::new(config.format).and_then(|formatter| {
|
} else {
|
||||||
formatter
|
Some(Ok(trimmed.to_string()))
|
||||||
.map_meta(|var, _| match var {
|
}
|
||||||
"symbol" => Some(config.symbol),
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
})
|
})
|
||||||
.map_style(|variable| match variable {
|
.parse(None)
|
||||||
"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 {
|
match parsed {
|
||||||
Ok(segments) => module.set_segments(segments),
|
Ok(segments) => module.set_segments(segments),
|
||||||
Err(error) => {
|
Err(error) => {
|
||||||
log::warn!("Error in module `custom.{}`:\n{}", name, error);
|
log::warn!("Error in module `custom.{}`:\n{}", name, error);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
|
||||||
let elapsed = start.elapsed();
|
let elapsed = start.elapsed();
|
||||||
log::trace!("Took {:?} to compute custom module {:?}", elapsed, name);
|
log::trace!("Took {:?} to compute custom module {:?}", elapsed, name);
|
||||||
module.duration = elapsed;
|
module.duration = elapsed;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user