From c95d0e769f31b21f5e2d4aaf6465468344f1bfd6 Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Tue, 25 Jul 2023 10:04:12 +0200 Subject: feat(plugins): make plugins configurable (#2646) * work * make every plugin entry point configurable * make integration tests pass * make e2e tests pass * add test for plugin configuration * add test snapshot * add plugin config parsing test * cleanups * style(fmt): rustfmt * style(comment): remove commented code --- zellij-utils/src/cli.rs | 8 +- zellij-utils/src/input/actions.rs | 29 ++++-- zellij-utils/src/input/config.rs | 4 + zellij-utils/src/input/layout.rs | 29 ++++++ zellij-utils/src/input/plugins.rs | 6 +- zellij-utils/src/input/unit/layout_test.rs | 25 +++++ ...an_load_swap_layouts_from_a_different_file.snap | 20 +++- zellij-utils/src/kdl/kdl_layout_parser.rs | 65 ++++++++++++- zellij-utils/src/kdl/mod.rs | 107 ++++++++++++++------- ...st__default_config_with_no_cli_arguments-2.snap | 49 ++++++++++ ...test__default_config_with_no_cli_arguments.snap | 13 +++ ...__layout_env_vars_override_config_env_vars.snap | 13 +++ ...__layout_keybinds_override_config_keybinds.snap | 13 +++ ...st__layout_plugins_override_config_plugins.snap | 16 +++ ...test__layout_themes_override_config_themes.snap | 13 +++ ...ayout_ui_config_overrides_config_ui_config.snap | 13 +++ 16 files changed, 371 insertions(+), 52 deletions(-) (limited to 'zellij-utils') diff --git a/zellij-utils/src/cli.rs b/zellij-utils/src/cli.rs index 6639f810b..fd2bdcda7 100644 --- a/zellij-utils/src/cli.rs +++ b/zellij-utils/src/cli.rs @@ -2,7 +2,7 @@ use crate::data::{Direction, InputMode, Resize}; use crate::setup::Setup; use crate::{ consts::{ZELLIJ_CONFIG_DIR_ENV, ZELLIJ_CONFIG_FILE_ENV}, - input::options::CliOptions, + input::{layout::PluginUserConfiguration, options::CliOptions}, }; use clap::{Parser, Subcommand}; use serde::{Deserialize, Serialize}; @@ -292,6 +292,8 @@ pub enum CliAction { requires("command") )] start_suspended: bool, + #[clap(short, long, value_parser)] + configuration: Option, }, /// Open the specified file in a new zellij pane with your default EDITOR Edit { @@ -376,10 +378,14 @@ pub enum CliAction { QueryTabNames, StartOrReloadPlugin { url: String, + #[clap(short, long, value_parser)] + configuration: Option, }, LaunchOrFocusPlugin { #[clap(short, long, value_parser)] floating: bool, url: Url, + #[clap(short, long, value_parser)] + configuration: Option, }, } diff --git a/zellij-utils/src/input/actions.rs b/zellij-utils/src/input/actions.rs index c2071846e..568c0a2c2 100644 --- a/zellij-utils/src/input/actions.rs +++ b/zellij-utils/src/input/actions.rs @@ -230,8 +230,8 @@ pub enum Action { /// Query all tab names QueryTabNames, /// Open a new tiled (embedded, non-floating) plugin pane - NewTiledPluginPane(RunPluginLocation, Option), // String is an optional name - NewFloatingPluginPane(RunPluginLocation, Option), // String is an optional name + NewTiledPluginPane(RunPlugin, Option), // String is an optional name + NewFloatingPluginPane(RunPlugin, Option), // String is an optional name StartOrReloadPlugin(RunPlugin), CloseTerminalPane(u32), ClosePluginPane(u32), @@ -292,21 +292,24 @@ impl Action { name, close_on_exit, start_suspended, + configuration, } => { let current_dir = get_current_dir(); 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) + .map_err(|e| format!("Failed to parse plugin loction {plugin}: {}", e))?; + let plugin = RunPlugin { + _allow_exec_host_cmd: false, + location, + configuration: user_configuration, + }; if floating { - let plugin = RunPluginLocation::parse(&plugin, cwd).map_err(|e| { - format!("Failed to parse plugin loction {plugin}: {}", e) - })?; Ok(vec![Action::NewFloatingPluginPane(plugin, name)]) } else { - let plugin = RunPluginLocation::parse(&plugin, cwd).map_err(|e| { - format!("Failed to parse plugin location {plugin}: {}", e) - })?; // it is intentional that a new tiled plugin pane cannot include a // direction // this is because the cli client opening a tiled plugin pane is a @@ -480,23 +483,29 @@ impl Action { CliAction::PreviousSwapLayout => Ok(vec![Action::PreviousSwapLayout]), CliAction::NextSwapLayout => Ok(vec![Action::NextSwapLayout]), CliAction::QueryTabNames => Ok(vec![Action::QueryTabNames]), - CliAction::StartOrReloadPlugin { url } => { + 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)]) }, - CliAction::LaunchOrFocusPlugin { url, floating } => { + CliAction::LaunchOrFocusPlugin { + url, + floating, + configuration, + } => { 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(), }; Ok(vec![Action::LaunchOrFocusPlugin(run_plugin, floating)]) }, diff --git a/zellij-utils/src/input/config.rs b/zellij-utils/src/input/config.rs index 4ad4ef89d..55170aec2 100644 --- a/zellij-utils/src/input/config.rs +++ b/zellij-utils/src/input/config.rs @@ -600,6 +600,7 @@ mod config_test { run: PluginType::Pane(None), location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")), _allow_exec_host_cmd: false, + userspace_configuration: Default::default(), }, ); expected_plugin_configuration.insert( @@ -609,6 +610,7 @@ mod config_test { run: PluginType::Pane(None), location: RunPluginLocation::Zellij(PluginTag::new("status-bar")), _allow_exec_host_cmd: false, + userspace_configuration: Default::default(), }, ); expected_plugin_configuration.insert( @@ -618,6 +620,7 @@ mod config_test { run: PluginType::Pane(None), location: RunPluginLocation::Zellij(PluginTag::new("strider")), _allow_exec_host_cmd: true, + userspace_configuration: Default::default(), }, ); expected_plugin_configuration.insert( @@ -627,6 +630,7 @@ mod config_test { run: PluginType::Pane(None), location: RunPluginLocation::Zellij(PluginTag::new("compact-bar")), _allow_exec_host_cmd: false, + userspace_configuration: Default::default(), }, ); assert_eq!( diff --git a/zellij-utils/src/input/layout.rs b/zellij-utils/src/input/layout.rs index c1d95a125..55e5fc69f 100644 --- a/zellij-utils/src/input/layout.rs +++ b/zellij-utils/src/input/layout.rs @@ -212,6 +212,35 @@ pub struct RunPlugin { #[serde(default)] pub _allow_exec_host_cmd: bool, pub location: RunPluginLocation, + pub configuration: PluginUserConfiguration, +} + +#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub struct PluginUserConfiguration(BTreeMap); + +impl PluginUserConfiguration { + pub fn new(configuration: BTreeMap) -> Self { + PluginUserConfiguration(configuration) + } + pub fn inner(&self) -> &BTreeMap { + &self.0 + } +} + +impl FromStr for PluginUserConfiguration { + type Err = &'static str; + + fn from_str(s: &str) -> Result { + let mut ret = BTreeMap::new(); + let configs = s.split(','); + for config in configs { + let mut config = config.split('='); + let key = config.next().ok_or("invalid configuration key")?.to_owned(); + let value = config.map(|c| c.to_owned()).collect::>().join("="); + ret.insert(key, value); + } + Ok(PluginUserConfiguration(ret)) + } } #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] diff --git a/zellij-utils/src/input/plugins.rs b/zellij-utils/src/input/plugins.rs index 47cc3aa74..f12aba2a2 100644 --- a/zellij-utils/src/input/plugins.rs +++ b/zellij-utils/src/input/plugins.rs @@ -8,7 +8,7 @@ use thiserror::Error; use serde::{Deserialize, Serialize}; use url::Url; -use super::layout::{RunPlugin, RunPluginLocation}; +use super::layout::{PluginUserConfiguration, RunPlugin, RunPluginLocation}; #[cfg(not(target_family = "wasm"))] use crate::consts::ASSET_MAP; pub use crate::data::PluginTag; @@ -48,9 +48,11 @@ impl PluginsConfig { 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 }), } @@ -86,6 +88,8 @@ pub struct PluginConfig { pub _allow_exec_host_cmd: bool, /// Original location of the pub location: RunPluginLocation, + /// Custom configuration for this plugin + pub userspace_configuration: PluginUserConfiguration, } impl PluginConfig { diff --git a/zellij-utils/src/input/unit/layout_test.rs b/zellij-utils/src/input/unit/layout_test.rs index fee88aae4..038161a49 100644 --- a/zellij-utils/src/input/unit/layout_test.rs +++ b/zellij-utils/src/input/unit/layout_test.rs @@ -504,9 +504,18 @@ fn layout_with_plugin_panes() { pane { plugin location="file:/path/to/my/plugin.wasm" } + pane { + plugin location="zellij:status-bar" { + config_key_1 "config_value_1" + "2" true + } + } } "#; let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into(), None, None).unwrap(); + let mut expected_plugin_configuration = BTreeMap::new(); + expected_plugin_configuration.insert("config_key_1".to_owned(), "config_value_1".to_owned()); + expected_plugin_configuration.insert("2".to_owned(), "true".to_owned()); let expected_layout = Layout { template: Some(( TiledPaneLayout { @@ -515,6 +524,7 @@ fn layout_with_plugin_panes() { run: Some(Run::Plugin(RunPlugin { location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")), _allow_exec_host_cmd: false, + configuration: Default::default(), })), ..Default::default() }, @@ -524,6 +534,15 @@ fn layout_with_plugin_panes() { "/path/to/my/plugin.wasm", )), _allow_exec_host_cmd: false, + configuration: Default::default(), + })), + ..Default::default() + }, + TiledPaneLayout { + run: Some(Run::Plugin(RunPlugin { + location: RunPluginLocation::Zellij(PluginTag::new("status-bar")), + _allow_exec_host_cmd: false, + configuration: PluginUserConfiguration(expected_plugin_configuration), })), ..Default::default() }, @@ -2016,6 +2035,7 @@ fn run_plugin_location_parsing() { run: Some(Run::Plugin(RunPlugin { _allow_exec_host_cmd: false, location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")), + configuration: Default::default(), })), ..Default::default() }, @@ -2025,6 +2045,7 @@ fn run_plugin_location_parsing() { location: RunPluginLocation::File(PathBuf::from( "/path/to/my/plugin.wasm", )), + configuration: Default::default(), })), ..Default::default() }, @@ -2032,6 +2053,7 @@ fn run_plugin_location_parsing() { run: Some(Run::Plugin(RunPlugin { _allow_exec_host_cmd: false, location: RunPluginLocation::File(PathBuf::from("plugin.wasm")), + configuration: Default::default(), })), ..Default::default() }, @@ -2041,6 +2063,7 @@ fn run_plugin_location_parsing() { location: RunPluginLocation::File(PathBuf::from( "relative/with space/plugin.wasm", )), + configuration: Default::default(), })), ..Default::default() }, @@ -2050,6 +2073,7 @@ fn run_plugin_location_parsing() { location: RunPluginLocation::File(PathBuf::from( "/absolute/with space/plugin.wasm", )), + configuration: Default::default(), })), ..Default::default() }, @@ -2059,6 +2083,7 @@ fn run_plugin_location_parsing() { location: RunPluginLocation::File(PathBuf::from( "c:/absolute/windows/plugin.wasm", )), + configuration: 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 98d4fef5a..e9f849b7f 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: 1850 +assertion_line: 1863 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -66,6 +66,9 @@ Layout { "tab-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -150,6 +153,9 @@ Layout { "status-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -194,6 +200,9 @@ Layout { "tab-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -331,6 +340,9 @@ Layout { "status-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -375,6 +387,9 @@ Layout { "tab-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -578,6 +593,9 @@ Layout { "status-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), diff --git a/zellij-utils/src/kdl/kdl_layout_parser.rs b/zellij-utils/src/kdl/kdl_layout_parser.rs index a5cab4b1b..9cee47988 100644 --- a/zellij-utils/src/kdl/kdl_layout_parser.rs +++ b/zellij-utils/src/kdl/kdl_layout_parser.rs @@ -2,9 +2,9 @@ use crate::input::{ command::RunCommand, config::ConfigError, layout::{ - FloatingPaneLayout, Layout, LayoutConstraint, PercentOrFixed, Run, RunPlugin, - RunPluginLocation, SplitDirection, SplitSize, SwapFloatingLayout, SwapTiledLayout, - TiledPaneLayout, + FloatingPaneLayout, Layout, LayoutConstraint, PercentOrFixed, PluginUserConfiguration, Run, + RunPlugin, RunPluginLocation, SplitDirection, SplitSize, SwapFloatingLayout, + SwapTiledLayout, TiledPaneLayout, }, }; @@ -14,7 +14,8 @@ use std::collections::{BTreeMap, HashMap, HashSet}; use std::str::FromStr; use crate::{ - kdl_child_with_name, kdl_children_nodes, kdl_get_bool_property_or_child_value, + kdl_child_with_name, kdl_children_nodes, kdl_first_entry_as_bool, kdl_first_entry_as_i64, + kdl_first_entry_as_string, kdl_get_bool_property_or_child_value, kdl_get_bool_property_or_child_value_with_error, kdl_get_child, kdl_get_int_property_or_child_value, kdl_get_property_or_child, kdl_get_string_property_or_child_value, kdl_get_string_property_or_child_value_with_error, @@ -121,6 +122,11 @@ impl<'a> KdlLayoutParser<'a> { || property_name == "min_panes" || property_name == "exact_panes" } + pub fn is_a_reserved_plugin_property(property_name: &str) -> bool { + property_name == "location" + || property_name == "_allow_exec_host_cmd" + || property_name == "path" + } fn assert_legal_node_name(&self, name: &str, kdl_node: &KdlNode) -> Result<(), ConfigError> { if name.contains(char::is_whitespace) { Err(ConfigError::new_layout_kdl_error( @@ -305,11 +311,62 @@ impl<'a> KdlLayoutParser<'a> { url_node.span().len(), ) })?; + let configuration = KdlLayoutParser::parse_plugin_user_configuration(&plugin_block)?; Ok(Some(Run::Plugin(RunPlugin { _allow_exec_host_cmd, location, + configuration, }))) } + pub fn parse_plugin_user_configuration( + plugin_block: &KdlNode, + ) -> Result { + let mut configuration = BTreeMap::new(); + for user_configuration_entry in plugin_block.entries() { + let name = user_configuration_entry.name(); + let value = user_configuration_entry.value(); + if let Some(name) = name { + let name = name.to_string(); + if KdlLayoutParser::is_a_reserved_plugin_property(&name) { + continue; + } + configuration.insert(name, value.to_string()); + } + // we ignore "bare" (eg. `plugin i_am_a_bare_true_argument { arg_one 1; }`) entries + // to prevent diverging behaviour with the keybindings config + } + if let Some(user_config) = kdl_children_nodes!(plugin_block) { + for user_configuration_entry in user_config { + let config_entry_name = kdl_name!(user_configuration_entry); + if KdlLayoutParser::is_a_reserved_plugin_property(&config_entry_name) { + continue; + } + let config_entry_str_value = kdl_first_entry_as_string!(user_configuration_entry) + .map(|s| format!("{}", s.to_string())); + let config_entry_int_value = kdl_first_entry_as_i64!(user_configuration_entry) + .map(|s| format!("{}", s.to_string())); + let config_entry_bool_value = kdl_first_entry_as_bool!(user_configuration_entry) + .map(|s| format!("{}", s.to_string())); + let config_entry_children = user_configuration_entry + .children() + .map(|s| format!("{}", s.to_string().trim())); + let config_entry_value = config_entry_str_value + .or(config_entry_int_value) + .or(config_entry_bool_value) + .or(config_entry_children) + .ok_or(ConfigError::new_kdl_error( + format!( + "Failed to parse plugin block configuration: {:?}", + user_configuration_entry + ), + plugin_block.span().offset(), + plugin_block.span().len(), + ))?; + configuration.insert(config_entry_name.into(), config_entry_value); + } + } + Ok(PluginUserConfiguration::new(configuration)) + } fn parse_args(&self, pane_node: &KdlNode) -> Result>, ConfigError> { match kdl_get_child!(pane_node, "args") { Some(kdl_args) => { diff --git a/zellij-utils/src/kdl/mod.rs b/zellij-utils/src/kdl/mod.rs index a75292900..341415c1c 100644 --- a/zellij-utils/src/kdl/mod.rs +++ b/zellij-utils/src/kdl/mod.rs @@ -3,13 +3,13 @@ use crate::data::{Direction, InputMode, Key, Palette, PaletteColor, Resize}; use crate::envs::EnvironmentVariables; use crate::input::config::{Config, ConfigError, KdlError}; use crate::input::keybinds::Keybinds; -use crate::input::layout::{Layout, RunPlugin, RunPluginLocation}; +use crate::input::layout::{Layout, PluginUserConfiguration, RunPlugin, RunPluginLocation}; use crate::input::options::{Clipboard, OnForceClose, Options}; use crate::input::plugins::{PluginConfig, PluginTag, PluginType, PluginsConfig}; use crate::input::theme::{FrameConfig, Theme, Themes, UiConfig}; use crate::setup::{find_default_config_dir, get_layout_dir}; use kdl_layout_parser::KdlLayoutParser; -use std::collections::HashMap; +use std::collections::{BTreeMap, HashMap}; use strum::IntoEnumIterator; use miette::NamedSource; @@ -136,6 +136,17 @@ macro_rules! kdl_first_entry_as_i64 { }; } +#[macro_export] +macro_rules! kdl_first_entry_as_bool { + ( $node:expr ) => { + $node + .entries() + .iter() + .next() + .and_then(|i| i.value().as_bool()) + }; +} + #[macro_export] macro_rules! entry_count { ( $node:expr ) => {{ @@ -894,9 +905,11 @@ impl TryFrom<(&KdlNode, &Options)> for Action { .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, }; Ok(Action::LaunchOrFocusPlugin(run_plugin, should_float)) }, @@ -1265,15 +1278,12 @@ macro_rules! kdl_get_string_property_or_child_value_with_error { #[macro_export] macro_rules! kdl_get_property_or_child { ( $kdl_node:expr, $name:expr ) => { - $kdl_node - .get($name) - // .and_then(|e| e.value().as_string()) - .or_else(|| { - $kdl_node - .children() - .and_then(|c| c.get($name)) - .and_then(|c| c.get(0)) - }) + $kdl_node.get($name).or_else(|| { + $kdl_node + .children() + .and_then(|c| c.get($name)) + .and_then(|c| c.get(0)) + }) }; } @@ -1402,30 +1412,6 @@ impl Options { } } -impl RunPlugin { - pub fn from_kdl(kdl_node: &KdlNode, cwd: Option) -> Result { - let _allow_exec_host_cmd = - kdl_get_child_entry_bool_value!(kdl_node, "_allow_exec_host_cmd").unwrap_or(false); - let string_url = kdl_get_child_entry_string_value!(kdl_node, "location").ok_or( - ConfigError::new_kdl_error( - "Plugins must have a location".into(), - kdl_node.span().offset(), - kdl_node.span().len(), - ), - )?; - let location = RunPluginLocation::parse(string_url, cwd).map_err(|e| { - ConfigError::new_layout_kdl_error( - e.to_string(), - kdl_node.span().offset(), - kdl_node.span().len(), - ) - })?; - Ok(RunPlugin { - _allow_exec_host_cmd, - location, - }) - } -} impl Layout { pub fn from_kdl( raw_layout: &str, @@ -1713,6 +1699,9 @@ impl PluginsConfig { 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); } @@ -1800,3 +1789,51 @@ impl Themes { Ok(themes) } } + +pub fn parse_plugin_user_configuration( + plugin_block: &KdlNode, +) -> Result, ConfigError> { + let mut configuration = BTreeMap::new(); + for user_configuration_entry in plugin_block.entries() { + let name = user_configuration_entry.name(); + let value = user_configuration_entry.value(); + if let Some(name) = name { + let name = name.to_string(); + if KdlLayoutParser::is_a_reserved_plugin_property(&name) { + continue; + } + configuration.insert(name, value.to_string()); + } + } + if let Some(user_config) = kdl_children_nodes!(plugin_block) { + for user_configuration_entry in user_config { + let config_entry_name = kdl_name!(user_configuration_entry); + if KdlLayoutParser::is_a_reserved_plugin_property(&config_entry_name) { + continue; + } + let config_entry_str_value = kdl_first_entry_as_string!(user_configuration_entry) + .map(|s| format!("{}", s.to_string())); + let config_entry_int_value = kdl_first_entry_as_i64!(user_configuration_entry) + .map(|s| format!("{}", s.to_string())); + let config_entry_bool_value = kdl_first_entry_as_bool!(user_configuration_entry) + .map(|s| format!("{}", s.to_string())); + let config_entry_children = user_configuration_entry + .children() + .map(|s| format!("{}", s.to_string().trim())); + let config_entry_value = config_entry_str_value + .or(config_entry_int_value) + .or(config_entry_bool_value) + .or(config_entry_children) + .ok_or(ConfigError::new_kdl_error( + format!( + "Failed to parse plugin block configuration: {:?}", + user_configuration_entry + ), + plugin_block.span().offset(), + plugin_block.span().len(), + ))?; + configuration.insert(config_entry_name.into(), config_entry_value); + } + } + Ok(configuration) +} 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 2af2cb567..e294f8173 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,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 640 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -29,6 +30,9 @@ Layout { "tab-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -70,6 +74,9 @@ Layout { "status-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -121,6 +128,9 @@ Layout { "tab-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -205,6 +215,9 @@ Layout { "status-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -249,6 +262,9 @@ Layout { "tab-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -386,6 +402,9 @@ Layout { "status-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -430,6 +449,9 @@ Layout { "tab-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -633,6 +655,9 @@ Layout { "status-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -684,6 +709,9 @@ Layout { "tab-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -752,6 +780,9 @@ Layout { "status-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -796,6 +827,9 @@ Layout { "tab-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -933,6 +967,9 @@ Layout { "status-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -977,6 +1014,9 @@ Layout { "tab-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -1180,6 +1220,9 @@ Layout { "status-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -1231,6 +1274,9 @@ Layout { "tab-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), @@ -1315,6 +1361,9 @@ Layout { "status-bar", ), ), + configuration: PluginUserConfiguration( + {}, + ), }, ), ), 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 c9267c329..23da443fc 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,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 639 expression: "format!(\"{:#?}\", config)" --- Config { @@ -3557,6 +3558,9 @@ Config { "compact-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "status-bar", @@ -3571,6 +3575,9 @@ Config { "status-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "strider", @@ -3585,6 +3592,9 @@ Config { "strider", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "tab-bar", @@ -3599,6 +3609,9 @@ Config { "tab-bar", ), ), + 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 2c8b20956..e5f37d87a 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,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 697 expression: "format!(\"{:#?}\", config)" --- Config { @@ -3557,6 +3558,9 @@ Config { "compact-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "status-bar", @@ -3571,6 +3575,9 @@ Config { "status-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "strider", @@ -3585,6 +3592,9 @@ Config { "strider", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "tab-bar", @@ -3599,6 +3609,9 @@ Config { "tab-bar", ), ), + 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 4cea16134..bb06be461 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,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 753 expression: "format!(\"{:#?}\", config)" --- Config { @@ -97,6 +98,9 @@ Config { "compact-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "status-bar", @@ -111,6 +115,9 @@ Config { "status-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "strider", @@ -125,6 +132,9 @@ Config { "strider", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "tab-bar", @@ -139,6 +149,9 @@ Config { "tab-bar", ), ), + 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 5f55ff1d7..5540a5710 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,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 725 expression: "format!(\"{:#?}\", config)" --- Config { @@ -3557,6 +3558,9 @@ Config { "compact-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "some-other-plugin", @@ -3571,6 +3575,9 @@ Config { "some-other-plugin", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "status-bar", @@ -3585,6 +3592,9 @@ Config { "status-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "strider", @@ -3599,6 +3609,9 @@ Config { "strider", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "tab-bar", @@ -3613,6 +3626,9 @@ Config { "tab-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, }, ui: UiConfig { 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 4534d4912..b885dafff 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,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 739 expression: "format!(\"{:#?}\", config)" --- Config { @@ -3861,6 +3862,9 @@ Config { "compact-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "status-bar", @@ -3875,6 +3879,9 @@ Config { "status-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "strider", @@ -3889,6 +3896,9 @@ Config { "strider", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "tab-bar", @@ -3903,6 +3913,9 @@ Config { "tab-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, }, 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 414b1d84b..b371b61ff 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,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 711 expression: "format!(\"{:#?}\", config)" --- Config { @@ -3557,6 +3558,9 @@ Config { "compact-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "status-bar", @@ -3571,6 +3575,9 @@ Config { "status-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "strider", @@ -3585,6 +3592,9 @@ Config { "strider", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, PluginTag( "tab-bar", @@ -3599,6 +3609,9 @@ Config { "tab-bar", ), ), + userspace_configuration: PluginUserConfiguration( + {}, + ), }, }, ui: UiConfig { -- cgit v1.2.3