diff options
| author | Aram Drevekenin <aram@poor.dev> | 2024-02-26 15:30:15 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-26 15:30:15 +0100 |
| commit | 21273ac95a2fed6b07d8550fe2d4f65993be7037 (patch) | |
| tree | f5a7aa488ece8f21c17350bb3ec14ceaf15f60a7 /zellij-utils/src | |
| parent | docs(changelog): add moving tab (diff) | |
| download | sl0ppij-21273ac95a2fed6b07d8550fe2d4f65993be7037.tar.gz sl0ppij-21273ac95a2fed6b07d8550fe2d4f65993be7037.tar.xz sl0ppij-21273ac95a2fed6b07d8550fe2d4f65993be7037.zip | |
feat(plugins): introduce plugin aliases (#3157)
* working prototype with passing tests
* new tests and passing plugin tests as well
* style(code): cleanups
* cleanup strider from unused search feature
* prototype of removing old plugin block from the config
* aliases working from config file and all tests passing
* fixups and cleanups
* use aliases in layouts
* update test snapshot
* style(fmt): rustfmt
Diffstat (limited to 'zellij-utils/src')
20 files changed, 1169 insertions, 998 deletions
diff --git a/zellij-utils/src/cli.rs b/zellij-utils/src/cli.rs index 595293f4..e5b65d39 100644 --- a/zellij-utils/src/cli.rs +++ b/zellij-utils/src/cli.rs @@ -627,7 +627,7 @@ pub enum CliAction { in_place: bool, #[clap(short, long, value_parser)] move_to_focused_tab: bool, - url: Url, + url: String, #[clap(short, long, value_parser)] configuration: Option<PluginUserConfiguration>, #[clap(short, long, value_parser)] diff --git a/zellij-utils/src/input/actions.rs b/zellij-utils/src/input/actions.rs index b19529e4..18ed0a8d 100644 --- a/zellij-utils/src/input/actions.rs +++ b/zellij-utils/src/input/actions.rs @@ -2,8 +2,8 @@ use super::command::RunCommandAction; use super::layout::{ - FloatingPaneLayout, Layout, RunPlugin, RunPluginLocation, SwapFloatingLayout, SwapTiledLayout, - TiledPaneLayout, + FloatingPaneLayout, Layout, PluginAlias, RunPlugin, RunPluginLocation, RunPluginOrAlias, + SwapFloatingLayout, SwapTiledLayout, TiledPaneLayout, }; use crate::cli::CliAction; use crate::data::{Direction, Resize}; @@ -217,9 +217,9 @@ pub enum Action { LeftClick(Position), RightClick(Position), MiddleClick(Position), - LaunchOrFocusPlugin(RunPlugin, bool, bool, bool, bool), // bools => should float, + LaunchOrFocusPlugin(RunPluginOrAlias, bool, bool, bool, bool), // bools => should float, // move_to_focused_tab, should_open_in_place, skip_cache - LaunchPlugin(RunPlugin, bool, bool, bool, Option<PathBuf>), // bools => should float, + LaunchPlugin(RunPluginOrAlias, bool, bool, bool, Option<PathBuf>), // bools => should float, // should_open_in_place, skip_cache, Option<PathBuf> is cwd LeftMouseRelease(Position), RightMouseRelease(Position), @@ -246,19 +246,19 @@ pub enum Action { /// Query all tab names QueryTabNames, /// Open a new tiled (embedded, non-floating) plugin pane - NewTiledPluginPane(RunPlugin, Option<String>, bool, Option<PathBuf>), // String is an optional name, bool is + NewTiledPluginPane(RunPluginOrAlias, Option<String>, bool, Option<PathBuf>), // String is an optional name, bool is // skip_cache, Option<PathBuf> is cwd NewFloatingPluginPane( - RunPlugin, + RunPluginOrAlias, Option<String>, bool, Option<PathBuf>, Option<FloatingPaneCoordinates>, ), // String is an optional name, bool is // skip_cache, Option<PathBuf> is cwd - NewInPlacePluginPane(RunPlugin, Option<String>, bool), // String is an optional name, bool is + NewInPlacePluginPane(RunPluginOrAlias, Option<String>, bool), // String is an optional name, bool is // skip_cache - StartOrReloadPlugin(RunPlugin), + StartOrReloadPlugin(RunPluginOrAlias), CloseTerminalPane(u32), ClosePluginPane(u32), FocusTerminalPaneWithId(u32, bool), // bool is should_float_if_hidden @@ -351,14 +351,20 @@ impl Action { let cwd = cwd .map(|cwd| current_dir.join(cwd)) .or_else(|| Some(current_dir)); - let user_configuration = configuration.unwrap_or_default(); if let Some(plugin) = plugin { - let location = RunPluginLocation::parse(&plugin, cwd.clone()) - .map_err(|e| format!("Failed to parse plugin loction {plugin}: {}", e))?; - let plugin = RunPlugin { - _allow_exec_host_cmd: false, - location, - configuration: user_configuration, + let plugin = match RunPluginLocation::parse(&plugin, cwd.clone()) { + Ok(location) => { + let user_configuration = configuration.unwrap_or_default(); + RunPluginOrAlias::RunPlugin(RunPlugin { + _allow_exec_host_cmd: false, + location, + configuration: user_configuration, + }) + }, + Err(_) => RunPluginOrAlias::Alias(PluginAlias::new( + &plugin, + &configuration.map(|c| c.inner().clone()), + )), }; if floating { Ok(vec![Action::NewFloatingPluginPane( @@ -571,14 +577,13 @@ impl Action { CliAction::QueryTabNames => Ok(vec![Action::QueryTabNames]), CliAction::StartOrReloadPlugin { url, configuration } => { let current_dir = get_current_dir(); - let run_plugin_location = RunPluginLocation::parse(&url, Some(current_dir)) - .map_err(|e| format!("Failed to parse plugin location: {}", e))?; - let run_plugin = RunPlugin { - location: run_plugin_location, - _allow_exec_host_cmd: false, - configuration: configuration.unwrap_or_default(), - }; - Ok(vec![Action::StartOrReloadPlugin(run_plugin)]) + let run_plugin_or_alias = RunPluginOrAlias::from_url( + &url, + &configuration.map(|c| c.inner().clone()), + None, + Some(current_dir), + )?; + Ok(vec![Action::StartOrReloadPlugin(run_plugin_or_alias)]) }, CliAction::LaunchOrFocusPlugin { url, @@ -589,15 +594,14 @@ impl Action { skip_plugin_cache, } => { let current_dir = get_current_dir(); - let run_plugin_location = RunPluginLocation::parse(url.as_str(), Some(current_dir)) - .map_err(|e| format!("Failed to parse plugin location: {}", e))?; - let run_plugin = RunPlugin { - location: run_plugin_location, - _allow_exec_host_cmd: false, - configuration: configuration.unwrap_or_default(), - }; + let run_plugin_or_alias = RunPluginOrAlias::from_url( + url.as_str(), + &configuration.map(|c| c.inner().clone()), + None, + Some(current_dir), + )?; Ok(vec![Action::LaunchOrFocusPlugin( - run_plugin, + run_plugin_or_alias, floating, move_to_focused_tab, in_place, @@ -612,16 +616,14 @@ impl Action { skip_plugin_cache, } => { let current_dir = get_current_dir(); - let run_plugin_location = - RunPluginLocation::parse(url.as_str(), Some(current_dir.clone())) - .map_err(|e| format!("Failed to parse plugin location: {}", e))?; - let run_plugin = RunPlugin { - location: run_plugin_location, - _allow_exec_host_cmd: false, - configuration: configuration.unwrap_or_default(), - }; + let run_plugin_or_alias = RunPluginOrAlias::from_url( + &url.as_str(), + &configuration.map(|c| c.inner().clone()), + None, + Some(current_dir.clone()), + )?; Ok(vec![Action::LaunchPlugin( - run_plugin, + run_plugin_or_alias, floating, in_place, skip_plugin_cache, diff --git a/zellij-utils/src/input/config.rs b/zellij-utils/src/input/config.rs index eb8fe521..cf6620a9 100644 --- a/zellij-utils/src/input/config.rs +++ b/zellij-utils/src/input/config.rs @@ -9,7 +9,7 @@ use std::convert::TryFrom; use super::keybinds::Keybinds; use super::options::Options; -use super::plugins::{PluginsConfig, PluginsConfigError}; +use super::plugins::{PluginAliases, PluginsConfigError}; use super::theme::{Themes, UiConfig}; use crate::cli::{CliArgs, Command}; use crate::envs::EnvironmentVariables; @@ -25,7 +25,7 @@ pub struct Config { pub keybinds: Keybinds, pub options: Options, pub themes: Themes, - pub plugins: PluginsConfig, + pub plugins: PluginAliases, pub ui: UiConfig, pub env: EnvironmentVariables, } @@ -226,7 +226,7 @@ impl Config { self.options = self.options.merge(other.options); self.keybinds.merge(other.keybinds.clone()); self.themes = self.themes.merge(other.themes); - self.plugins = self.plugins.merge(other.plugins); + self.plugins.merge(other.plugins); self.ui = self.ui.merge(other.ui); self.env = self.env.merge(other.env); Ok(()) @@ -237,11 +237,11 @@ impl Config { mod config_test { use super::*; use crate::data::{InputMode, Palette, PaletteColor, PluginTag}; - use crate::input::layout::RunPluginLocation; + use crate::input::layout::{RunPlugin, RunPluginLocation}; use crate::input::options::{Clipboard, OnForceClose}; - use crate::input::plugins::{PluginConfig, PluginType, PluginsConfig}; + use crate::input::plugins::{PluginConfig, PluginType}; use crate::input::theme::{FrameConfig, Theme, Themes, UiConfig}; - use std::collections::HashMap; + use std::collections::{BTreeMap, HashMap}; use std::io::Write; use tempfile::tempdir; @@ -591,60 +591,54 @@ mod config_test { fn can_define_plugin_configuration_in_configfile() { let config_contents = r#" plugins { - tab-bar { path "tab-bar"; } - status-bar { path "status-bar"; } - strider { - path "strider" - _allow_exec_host_cmd true + tab-bar location="zellij:tab-bar" + status-bar location="zellij:status-bar" + strider location="zellij:strider" + compact-bar location="zellij:compact-bar" + session-manager location="zellij:session-manager" + welcome-screen location="zellij:session-manager" { + welcome_screen true } - compact-bar { path "compact-bar"; } + filepicker location="zellij:strider" } "#; let config = Config::from_kdl(config_contents, None).unwrap(); - let mut expected_plugin_configuration = HashMap::new(); + let mut expected_plugin_configuration = BTreeMap::new(); expected_plugin_configuration.insert( - PluginTag::new("tab-bar"), - PluginConfig { - path: PathBuf::from("tab-bar"), - run: PluginType::Pane(None), - location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")), - _allow_exec_host_cmd: false, - userspace_configuration: Default::default(), - }, + "tab-bar".to_owned(), + RunPlugin::from_url("zellij:tab-bar").unwrap(), ); expected_plugin_configuration.insert( - PluginTag::new("status-bar"), - PluginConfig { - path: PathBuf::from("status-bar"), - run: PluginType::Pane(None), - location: RunPluginLocation::Zellij(PluginTag::new("status-bar")), - _allow_exec_host_cmd: false, - userspace_configuration: Default::default(), - }, + "status-bar".to_owned(), + RunPlugin::from_url("zellij:status-bar").unwrap(), ); expected_plugin_configuration.insert( - PluginTag::new("strider"), - PluginConfig { - path: PathBuf::from("strider"), - run: PluginType::Pane(None), - location: RunPluginLocation::Zellij(PluginTag::new("strider")), - _allow_exec_host_cmd: true, - userspace_configuration: Default::default(), - }, + "strider".to_owned(), + RunPlugin::from_url("zellij:strider").unwrap(), ); expected_plugin_configuration.insert( - PluginTag::new("compact-bar"), - PluginConfig { - path: PathBuf::from("compact-bar"), - run: PluginType::Pane(None), - location: RunPluginLocation::Zellij(PluginTag::new("compact-bar")), - _allow_exec_host_cmd: false, - userspace_configuration: Default::default(), - }, + "compact-bar".to_owned(), + RunPlugin::from_url("zellij:compact-bar").unwrap(), + ); + expected_plugin_configuration.insert( + "session-manager".to_owned(), + RunPlugin::from_url("zellij:session-manager").unwrap(), + ); + let mut welcome_screen_configuration = BTreeMap::new(); + welcome_screen_configuration.insert("welcome_screen".to_owned(), "true".to_owned()); + expected_plugin_configuration.insert( + "welcome-screen".to_owned(), + RunPlugin::from_url("zellij:session-manager") + .unwrap() + .with_configuration(welcome_screen_configuration), + ); + expected_plugin_configuration.insert( + "filepicker".to_owned(), + RunPlugin::from_url("zellij:strider").unwrap(), ); assert_eq!( config.plugins, - PluginsConfig::from_data(expected_plugin_configuration), + PluginAliases::from_data(expected_plugin_configuration), "Plugins defined in config" ); } diff --git a/zellij-utils/src/input/layout.rs b/zellij-utils/src/input/layout.rs index 3dfadb40..ad2fca89 100644 --- a/zellij-utils/src/input/layout.rs +++ b/zellij-utils/src/input/layout.rs @@ -23,7 +23,7 @@ use std::cmp::Ordering; use std::fmt::{Display, Formatter}; use std::str::FromStr; -use super::plugins::{PluginTag, PluginsConfigError}; +use super::plugins::{PluginAliases, PluginTag, PluginsConfigError}; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; use std::vec::Vec; @@ -80,10 +80,122 @@ impl SplitSize { } } +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] +pub enum RunPluginOrAlias { + RunPlugin(RunPlugin), + Alias(PluginAlias), +} + +impl Default for RunPluginOrAlias { + fn default() -> Self { + RunPluginOrAlias::RunPlugin(Default::default()) + } +} + +impl RunPluginOrAlias { + pub fn location_string(&self) -> String { + match self { + RunPluginOrAlias::RunPlugin(run_plugin) => run_plugin.location.display(), + RunPluginOrAlias::Alias(plugin_alias) => plugin_alias.name.clone(), + } + } + pub fn populate_run_plugin_if_needed(&mut self, plugin_aliases: &PluginAliases) { + if let RunPluginOrAlias::Alias(run_plugin_alias) = self { + if run_plugin_alias.run_plugin.is_some() { + log::warn!("Overriding plugin alias"); + } + let merged_run_plugin = plugin_aliases + .aliases + .get(run_plugin_alias.name.as_str()) + .map(|r| { + r.clone().merge_configuration( + &run_plugin_alias + .configuration + .as_ref() + .map(|c| c.inner().clone()), + ) + }); + run_plugin_alias.run_plugin = merged_run_plugin; + } + } + pub fn get_run_plugin(&self) -> Option<RunPlugin> { + match self { + RunPluginOrAlias::RunPlugin(run_plugin) => Some(run_plugin.clone()), + RunPluginOrAlias::Alias(plugin_alias) => plugin_alias.run_plugin.clone(), + } + } + pub fn get_configuration(&self) -> Option<PluginUserConfiguration> { + self.get_run_plugin().map(|r| r.configuration.clone()) + } + pub fn from_url( + url: &str, + configuration: &Option<BTreeMap<String, String>>, + alias_dict: Option<&PluginAliases>, + cwd: Option<PathBuf>, + ) -> Result<Self, String> { + match RunPluginLocation::parse(&url, cwd) { + Ok(location) => Ok(RunPluginOrAlias::RunPlugin(RunPlugin { + _allow_exec_host_cmd: false, + location, + configuration: configuration + .as_ref() + .map(|c| PluginUserConfiguration::new(c.clone())) + .unwrap_or_default(), + })), + Err(PluginsConfigError::InvalidUrlScheme(_)) + | Err(PluginsConfigError::InvalidUrl(..)) => { + let mut plugin_alias = PluginAlias::new(&url, configuration); + if let Some(alias_dict) = alias_dict { + plugin_alias.run_plugin = alias_dict + .aliases + .get(url) + .map(|r| r.clone().merge_configuration(configuration)); + } + Ok(RunPluginOrAlias::Alias(plugin_alias)) + }, + Err(e) => { + return Err(format!("Failed to parse plugin location {url}: {}", e)); + }, + } + } + pub fn is_equivalent_to_run(&self, run: &Option<Run>) -> bool { + match (self, run) { + ( + RunPluginOrAlias::Alias(self_alias), + Some(Run::Plugin(RunPluginOrAlias::Alias(run_alias))), + ) => { + self_alias.name == run_alias.name + && self_alias + .configuration + .as_ref() + // we do the is_empty() checks because an empty configuration is the same as no + // configuration (i.e. None) + .and_then(|c| if c.inner().is_empty() { None } else { Some(c) }) + == run_alias.configuration.as_ref().and_then(|c| { + if c.inner().is_empty() { + None + } else { + Some(c) + } + }) + }, + ( + RunPluginOrAlias::Alias(self_alias), + Some(Run::Plugin(RunPluginOrAlias::RunPlugin(other_run_plugin))), + ) => self_alias.run_plugin.as_ref() == Some(other_run_plugin), + ( + RunPluginOrAlias::RunPlugin(self_run_plugin), + Some(Run::Plugin(RunPluginOrAlias::RunPlugin(other_run_plugin))), + ) => self_run_plugin == other_run_plugin, + _ => false, + } + } +} + #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] pub enum Run { #[serde(rename = "plugin")] - Plugin(RunPlugin), + Plugin(RunPluginOrAlias), #[serde(rename = "command")] Command(RunCommand), EditFile(PathBuf, Option<usize>, Option<PathBuf>), // TODO: merge this with TerminalAction::OpenFile @@ -227,6 +339,23 @@ impl Run { Run::Cwd(cwd) => Some(cwd.clone()), } } + pub fn get_run_plugin(&self) -> Option<RunPlugin> { + match self { + Run::Plugin(RunPluginOrAlias::RunPlugin(run_plugin)) => Some(run_plugin.clone()), + Run::Plugin(RunPluginOrAlias::Alias(plugin_alias)) => { + plugin_alias.run_plugin.as_ref().map(|r| r.clone()) + }, + _ => None, + } + } + pub fn populate_run_plugin_if_needed(&mut self, alias_dict: &PluginAliases) { + match self { + Run::Plugin(run_plugin_alias) => { + run_plugin_alias.populate_run_plugin_if_needed(alias_dict) + }, + _ => {}, + } + } } #[allow(clippy::derive_hash_xor_eq)] @@ -246,6 +375,35 @@ impl RunPlugin { ..Default::default() }) } + pub fn with_configuration(mut self, configuration: BTreeMap<String, String>) -> Self { + self.configuration = PluginUserConfiguration::new(configuration); + self + } + pub fn merge_configuration(mut self, configuration: &Option<BTreeMap<String, String>>) -> Self { + if let Some(configuration) = configuration { + self.configuration.merge(configuration); + } + self + } +} + +#[derive(Debug, Serialize, Deserialize, Clone, Hash, Default, PartialEq, Eq)] +pub struct PluginAlias { + pub name: String, + pub configuration: Option<PluginUserConfiguration>, + pub run_plugin: Option<RunPlugin>, +} + +impl PluginAlias { + pub fn new(name: &str, configuration: &Option<BTreeMap<String, String>>) -> Self { + PluginAlias { + name: name.to_owned(), + configuration: configuration + .as_ref() + .map(|c| PluginUserConfiguration::new(c.clone())), + ..Default::default() + } + } } #[allow(clippy::derive_hash_xor_eq)] @@ -280,6 +438,11 @@ impl PluginUserConfiguration { pub fn insert(&mut self, config_key: impl Into<String>, config_value: impl Into<String>) { self.0.insert(config_key.into(), config_value.into()); } + pub fn merge(&mut self, other_config: &BTreeMap<String, String>) { + for (key, value) in other_config { + self.0.insert(key.to_owned(), value.clone()); + } + } } impl FromStr for PluginUserConfiguration { @@ -706,6 +869,15 @@ impl TiledPaneLayout { child.add_cwd_to_layout(cwd); } } + pub fn populate_plugin_aliases_in_layout(&mut self, plugin_aliases: &PluginAliases) { + match self.run.as_mut() { + Some(run) => run.populate_run_plugin_if_needed(plugin_aliases), + _ => {}, + } + for child in self.children.iter_mut() { + child.populate_plugin_aliases_in_layout(plugin_aliases); + } + } pub fn deepest_depth(&self) -> usize { let mut deepest_child_depth = 0; for child in self.children.iter() { @@ -1141,6 +1313,26 @@ impl Layout { Err(_e) => None, } } + pub fn populate_plugin_aliases_in_layout(&mut self, plugin_aliases: &PluginAliases) { + for tab in self.tabs.iter_mut() { + tab.1.populate_plugin_aliases_in_layout(plugin_aliases); + for floating_pane_layout in tab.2.iter_mut() { + floating_pane_layout + .run + .as_mut() + .map(|f| f.populate_run_plugin_if_needed(&plugin_aliases)); + } + } + if let Some(template) = self.template.as_mut() { + template.0.populate_plugin_aliases_in_layout(plugin_aliases); + for floating_pane_layout in template.1.iter_mut() { + floating_pane_layout + .run + .as_mut() + .map(|f| f.populate_run_plugin_if_needed(&plugin_aliases)); + } + } + } } fn split_space( diff --git a/zellij-utils/src/input/plugins.rs b/zellij-utils/src/input/plugins.rs index 2a262222..cb3d6891 100644 --- a/zellij-utils/src/input/plugins.rs +++ b/zellij-utils/src/input/plugins.rs @@ -1,6 +1,5 @@ //! Plugins configuration metadata -use std::borrow::Borrow; -use std::collections::HashMap; +use std::collections::BTreeMap; use std::fs; use std::path::{Path, PathBuf}; use thiserror::Error; @@ -14,73 +13,17 @@ use crate::consts::ASSET_MAP; pub use crate::data::PluginTag; use crate::errors::prelude::*; -use std::collections::BTreeMap; -use std::fmt; - -/// Used in the config struct for plugin metadata -#[derive(Clone, PartialEq, Deserialize, Serialize)] -pub struct PluginsConfig(pub HashMap<PluginTag, PluginConfig>); - -impl fmt::Debug for PluginsConfig { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let mut stable_sorted = BTreeMap::new(); - for (plugin_tag, plugin_config) in self.0.iter() { - stable_sorted.insert(plugin_tag, plugin_config); - } - write!(f, "{:#?}", stable_sorted) - } +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct PluginAliases { + pub aliases: BTreeMap<String, RunPlugin>, } -impl PluginsConfig { - pub fn new() -> Self { - Self(HashMap::new()) - } - pub fn from_data(data: HashMap<PluginTag, PluginConfig>) -> Self { - PluginsConfig(data) - } - - /// Get plugin config from run configuration specified in layout files. - pub fn get(&self, run: impl Borrow<RunPlugin>) -> Option<PluginConfig> { - let run = run.borrow(); - match &run.location { - RunPluginLocation::File(path) => Some(PluginConfig { - path: path.clone(), - run: PluginType::Pane(None), - _allow_exec_host_cmd: run._allow_exec_host_cmd, - location: run.location.clone(), - userspace_configuration: run.configuration.clone(), - }), - RunPluginLocation::Zellij(tag) => self.0.get(tag).cloned().map(|plugin| PluginConfig { - _allow_exec_host_cmd: run._allow_exec_host_cmd, - userspace_configuration: run.configuration.clone(), - ..plugin - }), - RunPluginLocation::Remote(_) => Some(PluginConfig { - path: PathBuf::new(), - run: PluginType::Pane(None), - _allow_exec_host_cmd: run._allow_exec_host_cmd, - location: run.location.clone(), - userspace_configuration: run.configuration.clone(), - }), - } - } - - pub fn iter(&self) -> impl Iterator<Item = &PluginConfig> { - self.0.values() +impl PluginAliases { + pub fn merge(&mut self, other: Self) { + self.aliases.extend(other.aliases); } - - /// Merges two PluginConfig structs into one PluginConfig struct - /// `other` overrides the PluginConfig of `self`. - pub fn merge(&self, other: Self) -> Self { - let mut plugin_config = self.0.clone(); - plugin_config.extend(other.0); - Self(plugin_config) - } -} - -impl Default for PluginsConfig { - fn default() -> Self { - PluginsConfig(HashMap::new()) + pub fn from_data(aliases: BTreeMap<String, RunPlugin>) -> Self { + PluginAliases { aliases } } } @@ -100,6 +43,44 @@ pub struct PluginConfig { } impl PluginConfig { + pub fn from_run_plugin(run_plugin: &RunPlugin) -> Option<PluginConfig> { + match &run_plugin.location { + RunPluginLocation::File(path) => Some(PluginConfig { + path: path.clone(), + run: PluginType::Pane(None), + _allow_exec_host_cmd: run_plugin._allow_exec_host_cmd, + location: run_plugin.location.clone(), + userspace_configuration: run_plugin.configuration.clone(), + }), + RunPluginLocation::Zellij(tag) => { + let tag = tag.to_string(); + if tag == "status-bar" + || tag == "tab-bar" + || tag == "compact-bar" + || tag == "strider" + || tag == "session-manager" + { + Some(PluginConfig { + path: PathBuf::from(&tag), + run: PluginType::Pane(None), + _allow_exec_host_cmd: run_plugin._allow_exec_host_cmd, + location: RunPluginLocation::parse(&format!("zellij:{}", tag), None) + .ok()?, + userspace_configuration: run_plugin.configuration.clone(), + }) + } else { + None + } + }, + RunPluginLocation::Remote(_) => Some(PluginConfig { + path: PathBuf::new(), + run: PluginType::Pane(None), + _allow_exec_host_cmd: run_plugin._allow_exec_host_cmd, + location: run_plugin.location.clone(), + userspace_configuration: run_plugin.configuration.clone(), + }), + } + } /// Resolve wasm plugin bytes for the plugin path and given plugin directory. /// /// If zellij was built without the 'disable_automatic_asset_installation' feature, builtin diff --git a/zellij-utils/src/input/unit/layout_test.rs b/zellij-utils/src/input/unit/layout_test.rs index 424a5b22..b2070ce1 100644 --- a/zellij-utils/src/input/unit/layout_test.rs +++ b/zellij-utils/src/input/unit/layout_test.rs @@ -551,29 +551,29 @@ fn layout_with_plugin_panes() { TiledPaneLayout { children: vec![ TiledPaneLayout { - run: Some(Run::Plugin(RunPlugin { + run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin { location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")), _allow_exec_host_cmd: false, configuration: Default::default(), - })), + }))), ..Default::default() }, TiledPaneLayout { - run: Some(Run::Plugin(RunPlugin { + run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin { location: RunPluginLocation::File(PathBuf::from( "/path/to/my/plugin.wasm", )), _allow_exec_host_cmd: false, configuration: Default::default(), - })), + }))), ..Default::default() }, TiledPaneLayout { - run: Some(Run::Plugin(RunPlugin { + run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin { location: RunPluginLocation::Zellij(PluginTag::new("status-bar")), _allow_exec_host_cmd: false, configuration: PluginUserConfiguration(expected_plugin_configuration), - })), + }))), ..Default::default() }, ], @@ -2079,6 +2079,9 @@ fn run_plugin_location_parsing() { pane { plugin location="file:c:/absolute/windows/plugin.wasm" } + pane { + plugin location="filepicker" + } } "#; let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into(), None, None).unwrap(); @@ -2087,59 +2090,67 @@ fn run_plugin_location_parsing() { TiledPaneLayout { children: vec![ TiledPaneLayout { - run: Some(Run::Plugin(RunPlugin { + run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin { _allow_exec_host_cmd: false, location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")), configuration: Default::default(), - })), + }))), ..Default::default() }, TiledPaneLayout { - run: Some(Run::Plugin(RunPlugin { + run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin { _allow_exec_host_cmd: false, location: RunPluginLocation::File(PathBuf::from( "/path/to/my/plugin.wasm", )), configuration: Default::default(), - })), + }))), ..Default::default() }, TiledPaneLayout { - run: Some(Run::Plugin(RunPlugin { + run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin { _allow_exec_host_cmd: false, location: RunPluginLocation::File(PathBuf::from("plugin.wasm")), configuration: Default::default(), - })), + }))), ..Default::default() }, TiledPaneLayout { - run: Some(Run::Plugin(RunPlugin { + run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin { _allow_exec_host_cmd: false, location: RunPluginLocation::File(PathBuf::from( "relative/with space/plugin.wasm", )), configuration: Default::default(), - })), + }))), ..Default::default() }, TiledPaneLayout { - run: Some(Run::Plugin(RunPlugin { + run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin { _allow_exec_host_cmd: false, location: RunPluginLocation::File(PathBuf::from( "/absolute/with space/plugin.wasm", )), configuration: Default::default(), - })), + }))), ..Default::default() }, TiledPaneLayout { - run: Some(Run::Plugin(RunPlugin { + run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin { _allow_exec_host_cmd: false, location: RunPluginLocation::File(PathBuf::from( "c:/absolute/windows/plugin.wasm", )), configuration: Default::default(), - })), + }))), + ..Default::default() + }, + TiledPaneLayout { + run: Some(Run::Plugin(RunPluginOrAlias::Alias(PluginAlias { + name: "filepicker".to_owned(), + configuration: Some(PluginUserConfiguration::default()), + ..Default::default() + }))), ..Default::default() }, ], diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_load_swap_layouts_from_a_different_file.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_load_swap_layouts_from_a_different_file.snap index 0ebdf2ca..abfd8801 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_load_swap_layouts_from_a_different_file.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_load_swap_layouts_from_a_different_file.snap @@ -1,6 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs -assertion_line: 1880 +assertion_line: 1935 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -65,17 +65,19 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + RunPlugin( + RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "tab-bar", + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + configuration: PluginUserConfiguration( + {}, + ), + }, + ), ), ), borderless: true, @@ -167,17 +169,19 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + RunPlugin( + RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "status-bar", + ), + ), + configuration: PluginUserConfiguration( + {}, ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + }, + ), ), ), borderless: true, @@ -220,17 +224,19 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + RunPlugin( + RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "tab-bar", + ), + ), + configuration: PluginUserConfiguration( + {}, ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + }, + ), ), ), borderless: true, @@ -387,17 +393,19 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + RunPlugin( + RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "status-bar", + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + configuration: PluginUserConfiguration( + {}, + ), + }, + ), ), ), borderless: true, @@ -440,17 +448,19 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + RunPlugin( + RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "tab-bar", + ), + ), + configuration: PluginUserConfiguration( + {}, ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + }, + ), ), ), borderless: true, @@ -688,17 +698,19 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + RunPlugin( + RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "status-bar", + ), + ), + configuration: PluginUserConfiguration( + {}, ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + }, + ), ), ), borderless: true, diff --git a/zellij-utils/src/ipc.rs b/zellij-utils/src/ipc.rs index 902d0235..b91ff697 100644 --- a/zellij-utils/src/ipc.rs +++ b/zellij-utils/src/ipc.rs @@ -4,7 +4,7 @@ use crate::{ data::{ClientId, ConnectToSession, InputMode, Style}, errors::{get_current_ctx, prelude::*, ErrorContext}, input::keybinds::Keybinds, - input::{actions::Action, layout::Layout, options::Options, plugins::PluginsConfig}, + input::{actions::Action, layout::Layout, options::Options, plugins::PluginAliases}, pane_size::{Size, SizeInPixels}, }; use interprocess::local_socket::LocalSocketStream; @@ -76,7 +76,7 @@ pub enum ClientToServerMsg { Box<CliArgs>, Box<Options>, Box<Layout>, - Option<PluginsConfig>, + Box<PluginAliases>, ), AttachClient( ClientAttributes, diff --git a/zellij-utils/src/kdl/kdl_layout_parser.rs b/zellij-utils/src/kdl/kdl_layout_parser.rs index 16be5fca..2aa3ba57 100644 --- a/zellij-utils/src/kdl/kdl_layout_parser.rs +++ b/zellij-utils/src/kdl/kdl_layout_parser.rs @@ -3,8 +3,8 @@ use crate::input::{ config::ConfigError, layout::{ FloatingPaneLayout, Layout, LayoutConstraint, PercentOrFixed, PluginUserConfiguration, Run, - RunPlugin, RunPluginLocation, SplitDirection, SplitSize, SwapFloatingLayout, - SwapTiledLayout, TiledPaneLayout, + RunPluginOrAlias, SplitDirection, SplitSize, SwapFloatingLayout, SwapTiledLayout, + TiledPaneLayout, }, }; @@ -313,20 +313,21 @@ impl<'a> KdlLayoutParser<'a> { plugin_block.span().len(), ), )?; - let location = - RunPluginLocation::parse(&string_url, self.cwd_prefix(None)?).map_err(|e| { - ConfigError::new_layout_kdl_error( - e.to_string(), - url_node.span().offset(), - url_node.span().len(), - ) - })?; let configuration = KdlLayoutParser::parse_plugin_user_configuration(&plugin_block)?; - Ok(Some(Run::Plugin(RunPlugin { - _allow_exec_host_cmd, - location, - configuration, - }))) + let run_plugin_or_alias = RunPluginOrAlias::from_url( + &string_url, + &Some(configuration.inner().clone()), + None, + self.cwd_prefix(None)?, + ) + .map_err(|e| { + ConfigError::new_kdl_error( + format!("Failed to parse plugin: {}", e), + url_node.span().offset(), + url_node.span().len(), + ) + })?; + Ok(Some(Run::Plugin(run_plugin_or_alias))) } pub fn parse_plugin_user_configuration( plugin_block: &KdlNode, diff --git a/zellij-utils/src/kdl/mod.rs b/zellij-utils/src/kdl/mod.rs index 1d721090..23d7e69e 100644 --- a/zellij-utils/src/kdl/mod.rs +++ b/zellij-utils/src/kdl/mod.rs @@ -7,10 +7,10 @@ use crate::envs::EnvironmentVariables; use crate::home::{find_default_config_dir, get_layout_dir}; use crate::input::config::{Config, ConfigError, KdlError}; use crate::input::keybinds::Keybinds; -use crate::input::layout::{Layout, PluginUserConfiguration, RunPlugin, RunPluginLocation}; +use crate::input::layout::{Layout, RunPlugin, RunPluginOrAlias}; use crate::input::options::{Clipboard, OnForceClose, Options}; use crate::input::permission::{GrantedPermission, PermissionCache}; -use crate::input::plugins::{PluginConfig, PluginTag, PluginType, PluginsConfig}; +use crate::input::plugins::PluginAliases; use crate::input::theme::{FrameConfig, Theme, Themes, UiConfig}; use kdl_layout_parser::KdlLayoutParser; use std::collections::{BTreeMap, HashMap, HashSet}; @@ -981,15 +981,22 @@ impl TryFrom<(&KdlNode, &Options)> for Action { .and_then(|c_m| kdl_child_bool_value_for_entry(c_m, "skip_plugin_cache")) .unwrap_or(false); let current_dir = std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")); - let location = RunPluginLocation::parse(&plugin_path, Some(current_dir))?; let configuration = KdlLayoutParser::parse_plugin_user_configuration(&kdl_action)?; - let run_plugin = RunPlugin { - location, - _allow_exec_host_cmd: false, - configuration, - }; + let run_plugin_or_alias = RunPluginOrAlias::from_url( + &plugin_path, + &Some(configuration.inner().clone()), + None, + Some(current_dir), + ) + .map_err(|e| { + ConfigError::new_kdl_error( + format!("Failed to parse plugin: {}", e), + kdl_action.span().offset(), + kdl_action.span().len(), + ) + })?; Ok(Action::LaunchOrFocusPlugin( - run_plugin, + run_plugin_or_alias, should_float, move_to_focused_tab, should_open_in_place, @@ -1019,15 +1026,22 @@ impl TryFrom<(&KdlNode, &Options)> for Action { .and_then(|c_m| kdl_child_bool_value_for_entry(c_m, "skip_plugin_cache")) .unwrap_or(false); let current_dir = std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")); - let location = RunPluginLocation::parse(&plugin_path, Some(current_dir))?; let configuration = KdlLayoutParser::parse_plugin_user_configuration(&kdl_action)?; - let run_plugin = RunPlugin { - location, - _allow_exec_host_cmd: false, - configuration, - }; + let run_plugin_or_alias = RunPluginOrAlias::from_url( + &plugin_path, + &Some(configuration.inner().clone()), + None, + Some(current_dir), + ) + .map_err(|e| { + ConfigError::new_kdl_error( + format!("Failed to parse plugin: {}", e), + kdl_action.span().offset(), + kdl_action.span().len(), + ) + })?; Ok(Action::LaunchPlugin( - run_plugin, + run_plugin_or_alias, should_float, should_open_in_place, skip_plugin_cache, @@ -1810,9 +1824,9 @@ impl Config { let config_themes = Themes::from_kdl(kdl_themes)?; config.themes = config.themes.merge(config_themes); } - if let Some(kdl_plugin_config) = kdl_config.get("plugins") { - let config_plugins = PluginsConfig::from_kdl(kdl_plugin_config)?; - config.plugins = config.plugins.merge(config_plugins); + if let Some(kdl_plugin_aliases) = kdl_config.get("plugins") { + let config_plugins = PluginAliases::from_kdl(kdl_plugin_aliases)?; + config.plugins.merge(config_plugins); } if let Some(kdl_ui_config) = kdl_config.get("ui") { let config_ui = UiConfig::from_kdl(&kdl_ui_config)?; @@ -1826,38 +1840,27 @@ impl Config { } } -impl PluginsConfig { - pub fn from_kdl(kdl_plugin_config: &KdlNode) -> Result<Self, ConfigError> { - let mut plugins: HashMap<PluginTag, PluginConfig> = HashMap::new(); - for plugin_config in - kdl_children_nodes_or_error!(kdl_plugin_config, "no plugin config found") - { - let plugin_name = kdl_name!(plugin_config); - let plugin_tag = PluginTag::new(plugin_name); - let path = kdl_children_property_first_arg_as_string!(plugin_config, "path") - .map(|path| PathBuf::from(path)) - .ok_or(ConfigError::new_kdl_error( - "Plugin path not found or invalid".into(), - plugin_config.span().offset(), - plugin_config.span().len(), - ))?; - let allow_exec_host_cmd = - kdl_children_property_first_arg_as_bool!(plugin_config, "_allow_exec_host_cmd") - .unwrap_or(false); - let plugin_config = PluginConfig { - path, - run: PluginType::Pane(None), - location: RunPluginLocation::Zellij(plugin_tag.clone()), - _allow_exec_host_cmd: allow_exec_host_cmd, - userspace_configuration: PluginUserConfiguration::new(BTreeMap::new()), // TODO: consider removing the whole - // "plugins" section in the config - // because it's not used??? - }; - plugins.insert(plugin_tag, plugin_config); +impl PluginAliases { + pub fn from_kdl(kdl_plugin_aliases: &KdlNode) -> Result<PluginAliases, ConfigError> { + let mut aliases: BTreeMap<String, RunPlugin> = BTreeMap::new(); + if let Some(kdl_plugin_aliases) = kdl_children_nodes!(kdl_plugin_aliases) { + for alias_definition in kdl_plugin_aliases { + let alias_name = kdl_name!(alias_definition); + if let Some(string_url) = + kdl_get_string_property_or_child_value!(alias_definition, "location") + { + let configuration = + KdlLayoutParser::parse_plugin_user_configuration(&alias_definition)?; + let run_plugin = RunPlugin::from_url(string_url)? + .with_configuration(configuration.inner().clone()); + aliases.insert(alias_name.to_owned(), run_plugin); + } + } } - Ok(PluginsConfig(plugins)) + Ok(PluginAliases { aliases }) } } + impl UiConfig { pub fn from_kdl(kdl_ui_config: &KdlNode) -> Result<UiConfig, ConfigError> { let mut ui_config = UiConfig::default(); diff --git a/zellij-utils/src/plugin_api/action.rs b/zellij-utils/src/plugin_api/action.rs index ed657897..5673d1f9 100644 --- a/zellij-utils/src/plugin_api/action.rs +++ b/zellij-utils/src/plugin_api/action.rs @@ -18,9 +18,10 @@ use crate::errors::prelude::*; use crate::input::actions::Action; use crate::input::actions::{SearchDirection, SearchOption}; use crate::input::command::RunCommandAction; -use crate::input::layout::{PluginUserConfiguration, RunPlugin, RunPluginLocation}; +use crate::input::layout::{ + PluginUserConfiguration, RunPlugin, RunPluginLocation, RunPluginOrAlias, +}; use crate::position::Position; -use url::Url; use std::collections::BTreeMap; use std::convert::TryFrom; @@ -403,24 +404,23 @@ impl TryFrom<ProtobufAction> for Action { Some(ProtobufActionName::LaunchOrFocusPlugin) => { match protobuf_action.optional_payload { Some(OptionalPayload::LaunchOrFocusPluginPayload(payload)) => { - let run_plugin_location = - RunPluginLocation::parse(&payload.plugin_url, None) - .map_err(|_| "Malformed LaunchOrFocusPlugin payload")?; let configuration: PluginUserConfiguration = payload .plugin_configuration .and_then(|p| PluginUserConfiguration::try_from(p).ok()) .unwrap_or_default(); - let run_plugin = RunPlugin { - _allow_exec_host_cmd: false, - location: run_plugin_location, - configuration, - }; + let run_plugin_or_alias = RunPluginOrAlias::from_url( + &payload.plugin_url.as_str(), + &Some(configuration.inner().clone()), + None, + None, + ) + .map_err(|_| "Malformed LaunchOrFocusPlugin payload")?; let should_float = payload.should_float; let move_to_focused_tab = payload.move_to_focused_tab; let should_open_in_place = payload.should_open_in_place; let skip_plugin_cache = payload.skip_plugin_cache; Ok(Action::LaunchOrFocusPlugin( - run_plugin, + run_plugin_or_alias, should_float, move_to_focused_tab, should_open_in_place, @@ -432,25 +432,24 @@ impl TryFrom<ProtobufAction> for Action { }, Some(ProtobufActionName::LaunchPlugin) => match protobuf_action.optional_payload { Some(OptionalPayload::LaunchOrFocusPluginPayload(payload)) => { - let run_plugin_location = - RunPluginLocation::parse(&payload.plugin_url, None) - .map_err(|_| "Malformed LaunchOrFocusPlugin payload")?; let configuration: PluginUserConfiguration = payload .plugin_configuration .and_then(|p| PluginUserConfiguration::try_from(p).ok()) .unwrap_or_default(); - let run_plugin = RunPlugin { - _allow_exec_host_cmd: false, - location: run_plugin_location, - configuration, - }; + let run_plugin_or_alias = RunPluginOrAlias::from_url( + &payload.plugin_url.as_str(), + &Some(configuration.inner().clone()), + None, + None, + ) + .map_err(|_| "Malformed LaunchOrFocusPlugin payload")?; let should_float = payload.should_float; let _move_to_focused_tab = payload.move_to_focused_tab; // not actually used in // this action let should_open_in_place = payload.should_open_in_place; let skip_plugin_cache = payload.skip_plugin_cache; Ok(Action::LaunchPlugin( - run_plugin, + run_plugin_or_alias, should_float, should_open_in_place, skip_plugin_cache, @@ -553,11 +552,11 @@ impl TryFrom<ProtobufAction> for Action { let run_plugin_location = RunPluginLocation::parse(&payload.plugin_url, None) .map_err(|_| "Malformed NewTiledPluginPane payload")?; - let run_plugin = RunPlugin { + let run_plugin = RunPluginOrAlias::RunPlugin(RunPlugin { location: run_plugin_location, _allow_exec_host_cmd: false, configuration: PluginUserConfiguration::default(), - }; + }); let pane_name = payload.pane_name; let skip_plugin_cache = payload.skip_plugin_cache; Ok(Action::NewTiledPluginPane( @@ -576,11 +575,11 @@ impl TryFrom<ProtobufAction> for Action { let run_plugin_location = RunPluginLocation::parse(&payload.plugin_url, None) .map_err(|_| "Malformed NewTiledPluginPane payload")?; - let run_plugin = RunPlugin { + let run_plugin = RunPluginOrAlias::RunPlugin(RunPlugin { location: run_plugin_location, _allow_exec_host_cmd: false, configuration: PluginUserConfiguration::default(), - }; + }); let pane_name = payload.pane_name; let skip_plugin_cache = payload.skip_plugin_cache; Ok(Action::NewFloatingPluginPane( @@ -597,14 +596,11 @@ impl TryFrom<ProtobufAction> for Action { Some(ProtobufActionName::StartOrReloadPlugin) => { match protobuf_action.optional_payload { Some(OptionalPayload::StartOrReloadPluginPayload(payload)) => { - let run_plugin_location = RunPluginLocation::parse(&payload, None) - .map_err(|_| "Malformed StartOrReloadPluginPayload payload")?; - let run_plugin = RunPlugin { - _allow_exec_host_cmd: false, - location: run_plugin_location, - configuration: PluginUserConfiguration::default(), - }; - Ok(Action::StartOrReloadPlugin(run_plugin)) + let run_plugin_or_alias = + RunPluginOrAlias::from_url(&payload.as_str(), &None, None, None) + .map_err(|_| "Malformed LaunchOrFocusPlugin payload")?; + + Ok(Action::StartOrReloadPlugin(run_plugin_or_alias)) }, _ => Err("Wrong payload for Action::StartOrReloadPlugin"), } @@ -1044,44 +1040,44 @@ impl TryFrom<Action> for ProtobufAction { }) }, Action::LaunchOrFocusPlugin( - run_plugin, + run_plugin_or_alias, should_float, move_to_focused_tab, should_open_in_place, skip_plugin_cache, ) => { - let url: Url = Url::from(&run_plugin.location); + let configuration = run_plugin_or_alias.get_configuration().unwrap_or_default(); Ok(ProtobufAction { name: ProtobufActionName::LaunchOrFocusPlugin as i32, optional_payload: Some(OptionalPayload::LaunchOrFocusPluginPayload( LaunchOrFocusPluginPayload { - plugin_url: url.into(), + plugin_url: run_plugin_or_alias.location_string(), should_float, move_to_focused_tab, should_open_in_place, - plugin_configuration: Some(run_plugin.configuration.try_into()?), + plugin_configuration: Some(configuration.try_into()?), skip_plugin_cache, }, )), }) }, Action::LaunchPlugin( - run_plugin, + run_plugin_or_alias, should_float, should_open_in_place, skip_plugin_cache, _cwd, ) => { - let url: Url = Url::from(&run_plugin.location); + let configuration = run_plugin_or_alias.get_configuration().unwrap_or_default(); Ok(ProtobufAction { name: ProtobufActionName::LaunchPlugin as i32, optional_payload: Some(OptionalPayload::LaunchOrFocusPluginPayload( LaunchOrFocusPluginPayload { - plugin_url: url.into(), + plugin_url: run_plugin_or_alias.location_string(), should_float, move_to_focused_tab: false, should_open_in_place, - plugin_configuration: Some(run_plugin.configuration.try_into()?), + plugin_configuration: Some(configuration.try_into()?), skip_plugin_cache, }, )), @@ -1166,12 +1162,11 @@ impl TryFrom<Action> for ProtobufAction { optional_payload: None, }), Action::NewTiledPluginPane(run_plugin, pane_name, skip_plugin_cache, _cwd) => { - let plugin_url: Url = Url::from(&run_plugin.location); Ok(ProtobufAction { name: ProtobufActionName::NewTiledPluginPane as i32, optional_payload: Some(OptionalPayload::NewTiledPluginPanePayload( NewPluginPanePayload { - plugin_url: plugin_url.into(), + plugin_url: run_plugin.location_string(), pane_name, skip_plugin_cache, }, @@ -1185,27 +1180,30 @@ impl TryFrom<Action> for ProtobufAction { _cwd, _coordinates, ) => { - let plugin_url: Url = Url::from(&run_plugin.location); + // let plugin_url: Url = match run_plugin { + // RunPluginOrAlias::RunPlugin(run_plugin) => Url::from(&run_plugin.location), + // RunPluginOrAlias::Alias(plugin_alias) => { + // // TODO: support plugin alias + // unimplemented!() + // } + // }; Ok(ProtobufAction { name: ProtobufActionName::NewFloatingPluginPane as i32, optional_payload: Some(OptionalPayload::NewFloatingPluginPanePayload( NewPluginPanePayload { - plugin_url: plugin_url.into(), + plugin_url: run_plugin.location_string(), pane_name, skip_plugin_cache, }, )), }) }, - Action::StartOrReloadPlugin(run_plugin) => { - let plugin_url: Url = Url::from(&run_plugin.location); - Ok(ProtobufAction { - name: ProtobufActionName::StartOrReloadPlugin as i32, - optional_payload: Some(OptionalPayload::StartOrReloadPluginPayload( - plugin_url.into(), - )), - }) - }, + Action::StartOrReloadPlugin(run_plugin) => Ok(ProtobufAction { + name: ProtobufActionName::StartOrReloadPlugin as i32, + optional_payload: Some(OptionalPayload::StartOrReloadPluginPayload( + run_plugin.location_string(), + )), + }), Action::CloseTerminalPane(terminal_pane_id) => Ok(ProtobufAction { name: ProtobufActionName::CloseTerminalPane as i32, optional_payload: Some(OptionalPayload::CloseTerminalPanePayload(terminal_pane_id)), diff --git a/zellij-utils/src/session_serialization.rs b/zellij-utils/src/session_serialization.rs index 0cd97328..d34aeb14 100644 --- a/zellij-utils/src/session_serialization.rs +++ b/zellij-utils/src/session_serialization.rs @@ -1,20 +1,11 @@ -//! # Persistence module -//! !WIP! This module is holding the logic for all persistence sessions need -//! -//! # Examples -//! ```rust,no_run -//! fn main() { -//! } -//! ``` -//! use std::collections::BTreeMap; use std::path::PathBuf; use crate::{ input::layout::PluginUserConfiguration, input::layout::{ - FloatingPaneLayout, Layout, PercentOrFixed, Run, SplitDirection, SplitSize, - SwapFloatingLayout, SwapTiledLayout, TiledPaneLayout, + FloatingPaneLayout, Layout, PercentOrFixed, Run, RunPluginOrAlias, SplitDirection, + SplitSize, SwapFloatingLayout, SwapTiledLayout, TiledPaneLayout, }, pane_size::{Constraint, PaneGeom}, }; @@ -238,10 +229,20 @@ fn extract_plugin_and_config( layout_run: &Option<Run>, ) -> (Option<String>, Option<PluginUserConfiguration>) { match &layout_run { - Some(Run::Plugin(run_plugin)) => ( - Some(run_plugin.location.display()), - Some(run_plugin.configuration.clone()), - ), + Some(Run::Plugin(run_plugin_or_alias)) => match run_plugin_or_alias { + RunPluginOrAlias::RunPlugin(run_plugin) => ( + Some(run_plugin.location.display()), + Some(run_plugin.configuration.clone()), + ), + RunPluginOrAlias::Alias(plugin_alias) => { + let name = plugin_alias.name.clone(); + let configuration = plugin_alias + .run_plugin + .as_ref() + .map(|run_plugin| run_plugin.configuration.clone()); + (Some(name), configuration) + }, + }, _ => (None, None), } } diff --git a/zellij-utils/src/setup.rs b/zellij-utils/src/setup.rs index bf34a894..d4146587 100644 --- a/zellij-utils/src/setup.rs +++ b/zellij-utils/src/setup.rs @@ -770,20 +770,6 @@ mod setup_test { assert_snapshot!(format!("{:#?}", config)); } #[test] - fn layout_plugins_override_config_plugins() { - let mut cli_args = CliArgs::default(); - cli_args.config = Some(PathBuf::from(format!( - "{}/src/test-fixtures/config-with-plugins-config.kdl", - env!("CARGO_MANIFEST_DIR") - ))); - cli_args.layout = Some(PathBuf::from(format!( - "{}/src/test-fixtures/layout-with-plugins-config.kdl", - env!("CARGO_MANIFEST_DIR") - ))); - let (config, _layout, _options, _, _) = Setup::from_cli_args(&cli_args).unwrap(); - assert_snapshot!(format!("{:#?}", config)); - } - #[test] fn layout_themes_override_config_themes() { let mut cli_args = CliArgs::default(); cli_args.config = Some(PathBuf::from(format!( diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments-2.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments-2.snap index e98379dd..ade6b116 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments-2.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments-2.snap @@ -1,6 +1,6 @@ --- source: zellij-utils/src/setup.rs -assertion_line: 672 +assertion_line: 699 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -23,17 +23,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + Alias( + PluginAlias { + name: "tab-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -73,17 +73,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + Alias( + PluginAlias { + name: "status-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -133,17 +133,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + Alias( + PluginAlias { + name: "tab-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -235,17 +235,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + Alias( + PluginAlias { + name: "status-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -288,17 +288,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + Alias( + PluginAlias { + name: "tab-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -455,17 +455,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + Alias( + PluginAlias { + name: "status-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -508,17 +508,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + Alias( + PluginAlias { + name: "tab-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -756,17 +756,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + Alias( + PluginAlias { + name: "status-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -816,17 +816,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + Alias( + PluginAlias { + name: "tab-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -899,17 +899,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + Alias( + PluginAlias { + name: "status-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -952,17 +952,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + Alias( + PluginAlias { + name: "tab-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -1119,17 +1119,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + Alias( + PluginAlias { + name: "status-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -1172,17 +1172,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + Alias( + PluginAlias { + name: "tab-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -1420,17 +1420,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + Alias( + PluginAlias { + name: "status-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -1480,17 +1480,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + Alias( + PluginAlias { + name: "tab-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, @@ -1582,17 +1582,17 @@ Layout { ), run: Some( Plugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + Alias( + PluginAlias { + name: "status-bar", + configuration: Some( + PluginUserConfiguration( + {}, + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + run_plugin: None, + }, + ), ), ), borderless: true, diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments.snap index f73b753e..18eaddce 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments.snap @@ -1,6 +1,6 @@ --- source: zellij-utils/src/setup.rs -assertion_line: 671 +assertion_line: 698 expression: "format!(\"{:#?}\", config)" --- Config { @@ -2655,17 +2655,19 @@ Config { 'w', ): [ LaunchOrFocusPlugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "session-manager", + RunPlugin( + RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + configuration: PluginUserConfiguration( + {}, + ), + }, + ), true, true, false, @@ -3831,91 +3833,87 @@ Config { serialization_interval: None, }, themes: {}, - plugins: { - PluginTag( - "compact-bar", - ): PluginConfig { - path: "compact-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "compact-bar", + plugins: PluginAliases { + aliases: { + "compact-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "compact-bar", + ), ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "session-manager", - ): PluginConfig { - path: "session-manager", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "session-manager", + configuration: PluginUserConfiguration( + {}, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "status-bar", - ): PluginConfig { - path: "status-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + }, + "filepicker": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "strider", + ), ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "strider", - ): PluginConfig { - path: "strider", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "strider", + configuration: PluginUserConfiguration( + {}, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "tab-bar", - ): PluginConfig { - path: "tab-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + }, + "session-manager": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "status-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "status-bar", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "strider": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "strider", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "tab-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "tab-bar", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "welcome-screen": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), + ), + configuration: PluginUserConfiguration( + { + "welcome_screen": "true", + }, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), + }, }, }, ui: UiConfig { diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_env_vars_override_config_env_vars.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_env_vars_override_config_env_vars.snap index b5c185c8..89f544ff 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_env_vars_override_config_env_vars.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_env_vars_override_config_env_vars.snap @@ -1,6 +1,6 @@ --- source: zellij-utils/src/setup.rs -assertion_line: 729 +assertion_line: 756 expression: "format!(\"{:#?}\", config)" --- Config { @@ -2655,17 +2655,19 @@ Config { 'w', ): [ LaunchOrFocusPlugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "session-manager", + RunPlugin( + RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + configuration: PluginUserConfiguration( + {}, + ), + }, + ), true, true, false, @@ -3831,91 +3833,87 @@ Config { serialization_interval: None, }, themes: {}, - plugins: { - PluginTag( - "compact-bar", - ): PluginConfig { - path: "compact-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "compact-bar", + plugins: PluginAliases { + aliases: { + "compact-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "compact-bar", + ), ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "session-manager", - ): PluginConfig { - path: "session-manager", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "session-manager", + configuration: PluginUserConfiguration( + {}, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "status-bar", - ): PluginConfig { - path: "status-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + }, + "filepicker": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "strider", + ), ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "strider", - ): PluginConfig { - path: "strider", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "strider", + configuration: PluginUserConfiguration( + {}, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "tab-bar", - ): PluginConfig { - path: "tab-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + }, + "session-manager": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "status-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "status-bar", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "strider": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "strider", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "tab-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "tab-bar", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "welcome-screen": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), + ), + configuration: PluginUserConfiguration( + { + "welcome_screen": "true", + }, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), + }, }, }, ui: UiConfig { diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_keybinds_override_config_keybinds.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_keybinds_override_config_keybinds.snap index a6df2f5e..23fddc93 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_keybinds_override_config_keybinds.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_keybinds_override_config_keybinds.snap @@ -1,6 +1,6 @@ --- source: zellij-utils/src/setup.rs -assertion_line: 785 +assertion_line: 813 expression: "format!(\"{:#?}\", config)" --- Config { @@ -89,91 +89,87 @@ Config { serialization_interval: None, }, themes: {}, - plugins: { - PluginTag( - "compact-bar", - ): PluginConfig { - path: "compact-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "compact-bar", + plugins: PluginAliases { + aliases: { + "compact-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "compact-bar", + ), ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "session-manager", - ): PluginConfig { - path: "session-manager", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "session-manager", + configuration: PluginUserConfiguration( + {}, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "status-bar", - ): PluginConfig { - path: "status-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + }, + "filepicker": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "strider", + ), ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "strider", - ): PluginConfig { - path: "strider", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "strider", + configuration: PluginUserConfiguration( + {}, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "tab-bar", - ): PluginConfig { - path: "tab-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + }, + "session-manager": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "status-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "status-bar", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "strider": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "strider", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "tab-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "tab-bar", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "welcome-screen": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), + ), + configuration: PluginUserConfiguration( + { + "welcome_screen": "true", + }, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), + }, }, }, ui: UiConfig { diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_plugins_override_config_plugins.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_plugins_override_config_plugins.snap index e055135e..6e891732 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_plugins_override_config_plugins.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_plugins_override_config_plugins.snap @@ -1,6 +1,6 @@ --- source: zellij-utils/src/setup.rs -assertion_line: 757 +assertion_line: 784 expression: "format!(\"{:#?}\", config)" --- Config { @@ -2655,17 +2655,19 @@ Config { 'w', ): [ LaunchOrFocusPlugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "session-manager", + RunPlugin( + RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + configuration: PluginUserConfiguration( + {}, + ), + }, + ), true, true, false, diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_themes_override_config_themes.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_themes_override_config_themes.snap index ba5df24d..1d682130 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_themes_override_config_themes.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_themes_override_config_themes.snap @@ -1,6 +1,6 @@ --- source: zellij-utils/src/setup.rs -assertion_line: 771 +assertion_line: 799 expression: "format!(\"{:#?}\", config)" --- Config { @@ -2655,17 +2655,19 @@ Config { 'w', ): [ LaunchOrFocusPlugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "session-manager", + RunPlugin( + RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + configuration: PluginUserConfiguration( + {}, + ), + }, + ), true, true, false, @@ -4135,91 +4137,87 @@ Config { }, }, }, - plugins: { - PluginTag( - "compact-bar", - ): PluginConfig { - path: "compact-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "compact-bar", + plugins: PluginAliases { + aliases: { + "compact-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "compact-bar", + ), ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "session-manager", - ): PluginConfig { - path: "session-manager", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "session-manager", + configuration: PluginUserConfiguration( + {}, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "status-bar", - ): PluginConfig { - path: "status-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + }, + "filepicker": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "strider", + ), ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "strider", - ): PluginConfig { - path: "strider", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "strider", + configuration: PluginUserConfiguration( + {}, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "tab-bar", - ): PluginConfig { - path: "tab-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + }, + "session-manager": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "status-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "status-bar", + ), ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "strider": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "strider", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "tab-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "tab-bar", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "welcome-screen": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), + ), + configuration: PluginUserConfiguration( + { + "welcome_screen": "true", + }, + ), + }, }, }, ui: UiConfig { diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_ui_config_overrides_config_ui_config.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_ui_config_overrides_config_ui_config.snap index a6e7350e..de44f0f1 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_ui_config_overrides_config_ui_config.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_ui_config_overrides_config_ui_config.snap @@ -1,6 +1,6 @@ --- source: zellij-utils/src/setup.rs -assertion_line: 743 +assertion_line: 770 expression: "format!(\"{:#?}\", config)" --- Config { @@ -2655,17 +2655,19 @@ Config { 'w', ): [ LaunchOrFocusPlugin( - RunPlugin { - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "session-manager", + RunPlugin( + RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), ), - ), - configuration: PluginUserConfiguration( - {}, - ), - }, + configuration: PluginUserConfiguration( + {}, + ), + }, + ), true, true, false, @@ -3831,91 +3833,87 @@ Config { serialization_interval: None, }, themes: {}, - plugins: { - PluginTag( - "compact-bar", - ): PluginConfig { - path: "compact-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "compact-bar", + plugins: PluginAliases { + aliases: { + "compact-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "compact-bar", + ), ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "session-manager", - ): PluginConfig { - path: "session-manager", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "session-manager", + configuration: PluginUserConfiguration( + {}, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "status-bar", - ): PluginConfig { - path: "status-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "status-bar", + }, + "filepicker": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "strider", + ), ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "strider", - ): PluginConfig { - path: "strider", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "strider", + configuration: PluginUserConfiguration( + {}, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), - }, - PluginTag( - "tab-bar", - ): PluginConfig { - path: "tab-bar", - run: Pane( - None, - ), - _allow_exec_host_cmd: false, - location: Zellij( - PluginTag( - "tab-bar", + }, + "session-manager": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "status-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "status-bar", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "strider": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "strider", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "tab-bar": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "tab-bar", + ), + ), + configuration: PluginUserConfiguration( + {}, + ), + }, + "welcome-screen": RunPlugin { + _allow_exec_host_cmd: false, + location: Zellij( + PluginTag( + "session-manager", + ), + ), + configuration: PluginUserConfiguration( + { + "welcome_screen": "true", + }, ), - ), - userspace_configuration: PluginUserConfiguration( - {}, - ), + }, }, }, ui: UiConfig { |
