diff options
Diffstat (limited to 'zellij-utils/src/kdl')
-rw-r--r-- | zellij-utils/src/kdl/kdl_layout_parser.rs | 31 | ||||
-rw-r--r-- | zellij-utils/src/kdl/mod.rs | 99 |
2 files changed, 67 insertions, 63 deletions
diff --git a/zellij-utils/src/kdl/kdl_layout_parser.rs b/zellij-utils/src/kdl/kdl_layout_parser.rs index 16be5fcaa..2aa3ba572 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 1d7210907..23d7e69ea 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(); |