diff options
Diffstat (limited to 'zellij-utils/src/kdl/mod.rs')
-rw-r--r-- | zellij-utils/src/kdl/mod.rs | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/zellij-utils/src/kdl/mod.rs b/zellij-utils/src/kdl/mod.rs index 71f48fc4f..e911f391e 100644 --- a/zellij-utils/src/kdl/mod.rs +++ b/zellij-utils/src/kdl/mod.rs @@ -1,7 +1,7 @@ mod kdl_layout_parser; use crate::data::{ - Direction, InputMode, Key, Palette, PaletteColor, PaneInfo, PaneManifest, PermissionType, - Resize, SessionInfo, TabInfo, + Direction, InputMode, Key, LayoutInfo, Palette, PaletteColor, PaneInfo, PaneManifest, + PermissionType, Resize, SessionInfo, TabInfo, }; use crate::envs::EnvironmentVariables; use crate::home::{find_default_config_dir, get_layout_dir}; @@ -1986,6 +1986,31 @@ impl SessionInfo { .and_then(|p| p.children()) .map(|p| PaneManifest::decode_from_kdl(p)) .ok_or("Failed to parse panes")?; + let available_layouts: Vec<LayoutInfo> = kdl_document + .get("available_layouts") + .and_then(|p| p.children()) + .map(|e| { + e.nodes() + .iter() + .filter_map(|n| { + let layout_name = n.name().value().to_owned(); + let layout_source = n + .entries() + .iter() + .find(|e| e.name().map(|n| n.value()) == Some("source")) + .and_then(|e| e.value().as_string()); + match layout_source { + Some(layout_source) => match layout_source { + "built-in" => Some(LayoutInfo::BuiltIn(layout_name)), + "file" => Some(LayoutInfo::File(layout_name)), + _ => None, + }, + None => None, + } + }) + .collect() + }) + .ok_or("Failed to parse available_layouts")?; let is_current_session = name == current_session_name; Ok(SessionInfo { name, @@ -1993,6 +2018,7 @@ impl SessionInfo { panes, connected_clients, is_current_session, + available_layouts, }) } pub fn to_string(&self) -> String { @@ -2017,10 +2043,25 @@ impl SessionInfo { let mut panes = KdlNode::new("panes"); panes.set_children(self.panes.encode_to_kdl()); + let mut available_layouts = KdlNode::new("available_layouts"); + let mut available_layouts_children = KdlDocument::new(); + for layout_info in &self.available_layouts { + let (layout_name, layout_source) = match layout_info { + LayoutInfo::File(name) => (name.clone(), "file"), + LayoutInfo::BuiltIn(name) => (name.clone(), "built-in"), + }; + let mut layout_node = KdlNode::new(format!("{}", layout_name)); + let layout_source = KdlEntry::new_prop("source", layout_source); + layout_node.entries_mut().push(layout_source); + available_layouts_children.nodes_mut().push(layout_node); + } + available_layouts.set_children(available_layouts_children); + kdl_document.nodes_mut().push(name); kdl_document.nodes_mut().push(tabs); kdl_document.nodes_mut().push(panes); kdl_document.nodes_mut().push(connected_clients); + kdl_document.nodes_mut().push(available_layouts); kdl_document.fmt(); kdl_document.to_string() } @@ -2506,6 +2547,11 @@ fn serialize_and_deserialize_session_info_with_data() { panes: PaneManifest { panes }, connected_clients: 2, is_current_session: false, + available_layouts: vec![ + LayoutInfo::File("layout1".to_owned()), + LayoutInfo::BuiltIn("layout2".to_owned()), + LayoutInfo::File("layout3".to_owned()), + ], }; let serialized = session_info.to_string(); let deserealized = SessionInfo::from_string(&serialized, "not this session").unwrap(); |