diff --git a/.github/config-schema.json b/.github/config-schema.json index bb5fdd85..9f30f307 100644 --- a/.github/config-schema.json +++ b/.github/config-schema.json @@ -1784,6 +1784,7 @@ }, "username": { "default": { + "aliases": {}, "detect_env_vars": [], "disabled": false, "format": "[$user]($style) in ", @@ -6129,6 +6130,13 @@ "disabled": { "default": false, "type": "boolean" + }, + "aliases": { + "default": {}, + "type": "object", + "additionalProperties": { + "type": "string" + } } }, "additionalProperties": false diff --git a/docs/config/README.md b/docs/config/README.md index 794190b7..dcec8381 100644 --- a/docs/config/README.md +++ b/docs/config/README.md @@ -4505,6 +4505,7 @@ these variables, one workaround is to set one of them with a dummy value. | `format` | `'[$user]($style) in '` | The format for the module. | | `show_always` | `false` | Always shows the `username` module. | | `disabled` | `false` | Disables the `username` module. | +| `aliases` | `{}` | Translate system usernames to something else | ### Variables @@ -4526,6 +4527,7 @@ style_root = 'black bold' format = 'user: [$user]($style) ' disabled = false show_always = true +aliases = { "corpuser034g" = "matchai" } ``` #### Hide the hostname in remote tmux sessions diff --git a/src/configs/username.rs b/src/configs/username.rs index 807dad51..1a333c1e 100644 --- a/src/configs/username.rs +++ b/src/configs/username.rs @@ -1,3 +1,4 @@ +use indexmap::IndexMap; use serde::{Deserialize, Serialize}; #[derive(Clone, Deserialize, Serialize)] @@ -14,6 +15,7 @@ pub struct UsernameConfig<'a> { pub style_user: &'a str, pub show_always: bool, pub disabled: bool, + pub aliases: IndexMap, } impl<'a> Default for UsernameConfig<'a> { @@ -25,6 +27,7 @@ impl<'a> Default for UsernameConfig<'a> { style_user: "yellow bold", show_always: false, disabled: false, + aliases: IndexMap::new(), } } } diff --git a/src/modules/username.rs b/src/modules/username.rs index 038bbd75..714eec07 100644 --- a/src/modules/username.rs +++ b/src/modules/username.rs @@ -40,6 +40,10 @@ pub fn module<'a>(context: &'a Context) -> Option> { return None; // [A] } + if let Some(&alias) = config.aliases.get(&username) { + username = alias.to_string(); + } + let parsed = StringFormatter::new(config.format).and_then(|formatter| { formatter .map_style(|variable| match variable { @@ -323,4 +327,40 @@ mod tests { assert_eq!(expected, actual.as_deref()); } + + #[test] + fn test_alias() { + let actual = ModuleRenderer::new("username") + .env(super::USERNAME_ENV_VAR, "astronaut") + .config(toml::toml! { + [username] + show_always = true + aliases = { "astronaut" = "skywalker" } + + style_root = "" + style_user = "" + }) + .collect(); + let expected = Some("skywalker in "); + + assert_eq!(expected, actual.as_deref()); + } + + #[test] + fn test_alias_emoji() { + let actual = ModuleRenderer::new("username") + .env(super::USERNAME_ENV_VAR, "kaas") + .config(toml::toml! { + [username] + show_always = true + aliases = { "a" = "b", "kaas" = "🧀" } + + style_root = "" + style_user = "" + }) + .collect(); + let expected = Some("🧀 in "); + + assert_eq!(expected, actual.as_deref()); + } }