summaryrefslogtreecommitdiffstats
path: root/zellij-utils
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2022-10-12 13:03:21 +0200
committerGitHub <noreply@github.com>2022-10-12 13:03:21 +0200
commita13aacf583e6e19cce5266eb661c6c282a28f049 (patch)
treec842a16aae9336d0d1fca880838712e6bcd61722 /zellij-utils
parent694afd223996f5adb0769fef592a5e93a44176e7 (diff)
fix(layouts): error on mixed nodes (#1791)
* fix(layouts): error on mixed nodes * style(fmt): rustfmt * style(clippy): make clippy happy
Diffstat (limited to 'zellij-utils')
-rw-r--r--zellij-utils/src/kdl/kdl_layout_parser.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/zellij-utils/src/kdl/kdl_layout_parser.rs b/zellij-utils/src/kdl/kdl_layout_parser.rs
index f572c3565..8824e44ed 100644
--- a/zellij-utils/src/kdl/kdl_layout_parser.rs
+++ b/zellij-utils/src/kdl/kdl_layout_parser.rs
@@ -212,6 +212,7 @@ impl<'a> KdlLayoutParser<'a> {
Some(children) => self.parse_child_pane_nodes_for_pane(&children)?,
None => (None, vec![]),
};
+ self.assert_no_mixed_children_and_properties(kdl_node)?;
Ok(PaneLayout {
borderless: borderless.unwrap_or_default(),
focus,
@@ -304,6 +305,7 @@ impl<'a> KdlLayoutParser<'a> {
Some(children) => self.parse_child_pane_nodes_for_pane(&children)?,
None => (None, vec![]),
};
+ self.assert_no_mixed_children_and_properties(kdl_node)?;
self.pane_templates.insert(
template_name,
(
@@ -414,6 +416,25 @@ impl<'a> KdlLayoutParser<'a> {
}
Ok((external_children_index, nodes))
}
+ fn has_child_panes_tabs_or_templates(&self, kdl_node: &KdlNode) -> bool {
+ if let Some(children) = kdl_children_nodes!(kdl_node) {
+ for child in children {
+ let child_node_name = kdl_name!(child);
+ if child_node_name == "pane"
+ || child_node_name == "children"
+ || child_node_name == "tab"
+ || child_node_name == "children"
+ {
+ return true;
+ } else if let Some((_pane_template, _pane_template_kdl_node)) =
+ self.pane_templates.get(child_node_name).cloned()
+ {
+ return true;
+ }
+ }
+ }
+ false
+ }
fn assert_one_children_block(
&self,
layout: &PaneLayout,
@@ -465,6 +486,42 @@ impl<'a> KdlLayoutParser<'a> {
}
Ok(())
}
+ fn assert_no_mixed_children_and_properties(
+ &self,
+ kdl_node: &KdlNode,
+ ) -> Result<(), ConfigError> {
+ let has_borderless_prop =
+ kdl_get_bool_property_or_child_value_with_error!(kdl_node, "borderless").is_some();
+ let has_focus_prop =
+ kdl_get_bool_property_or_child_value_with_error!(kdl_node, "focus").is_some();
+ let has_run_prop = self.parse_command_or_plugin_block(kdl_node)?.is_some();
+ let has_nested_nodes_or_children_block = self.has_child_panes_tabs_or_templates(kdl_node);
+
+ if has_nested_nodes_or_children_block
+ && (has_borderless_prop || has_focus_prop || has_run_prop)
+ {
+ let mut offending_nodes = vec![];
+ if has_borderless_prop {
+ offending_nodes.push("borderless");
+ }
+ if has_focus_prop {
+ offending_nodes.push("focus");
+ }
+ if has_run_prop {
+ offending_nodes.push("command/plugin");
+ }
+ Err(ConfigError::new_kdl_error(
+ format!(
+ "Cannot have both properties ({}) and nested children",
+ offending_nodes.join(", ")
+ ),
+ kdl_node.span().offset(),
+ kdl_node.span().len(),
+ ))
+ } else {
+ Ok(())
+ }
+ }
fn insert_layout_children_or_error(
&self,
layout: &mut PaneLayout,