model.rs

 1use std::path::{Path, PathBuf};
 2
 3use anyhow::{bail, Result};
 4
 5use gpui::Axis;
 6use sqlez::{
 7    bindable::{Bind, Column},
 8    statement::Statement,
 9};
10
11#[derive(Debug, PartialEq, Eq, Clone)]
12pub(crate) struct WorkspaceId(Vec<PathBuf>);
13
14impl<P: AsRef<Path>, T: IntoIterator<Item = P>> From<T> for WorkspaceId {
15    fn from(iterator: T) -> Self {
16        let mut roots = iterator
17            .into_iter()
18            .map(|p| p.as_ref().to_path_buf())
19            .collect::<Vec<_>>();
20        roots.sort();
21        Self(roots)
22    }
23}
24
25impl Bind for WorkspaceId {
26    fn bind(&self, statement: &Statement, start_index: i32) -> Result<i32> {
27        bincode::serialize(&self.0)
28            .expect("Bincode serialization of paths should not fail")
29            .bind(statement, start_index)
30    }
31}
32
33impl Column for WorkspaceId {
34    fn column(statement: &mut Statement, start_index: i32) -> Result<(Self, i32)> {
35        let blob = statement.column_blob(start_index)?;
36        Ok((WorkspaceId(bincode::deserialize(blob)?), start_index + 1))
37    }
38}
39
40#[derive(Default, Debug, PartialEq, Eq, Clone, Copy)]
41pub enum DockAnchor {
42    #[default]
43    Bottom,
44    Right,
45    Expanded,
46}
47
48impl Bind for DockAnchor {
49    fn bind(&self, statement: &Statement, start_index: i32) -> anyhow::Result<i32> {
50        match self {
51            DockAnchor::Bottom => "Bottom",
52            DockAnchor::Right => "Right",
53            DockAnchor::Expanded => "Expanded",
54        }
55        .bind(statement, start_index)
56    }
57}
58
59impl Column for DockAnchor {
60    fn column(statement: &mut Statement, start_index: i32) -> anyhow::Result<(Self, i32)> {
61        String::column(statement, start_index).and_then(|(anchor_text, next_index)| {
62            Ok((
63                match anchor_text.as_ref() {
64                    "Bottom" => DockAnchor::Bottom,
65                    "Right" => DockAnchor::Right,
66                    "Expanded" => DockAnchor::Expanded,
67                    _ => bail!("Stored dock anchor is incorrect"),
68                },
69                next_index,
70            ))
71        })
72    }
73}
74
75pub(crate) type WorkspaceRow = (WorkspaceId, DockAnchor, bool);
76
77#[derive(Debug)]
78pub struct SerializedWorkspace {
79    pub dock_anchor: DockAnchor,
80    pub dock_visible: bool,
81    pub center_group: SerializedPaneGroup,
82    pub dock_pane: SerializedPane,
83}
84
85#[derive(Debug, PartialEq, Eq)]
86pub struct SerializedPaneGroup {
87    axis: Axis,
88    children: Vec<PaneGroupChild>,
89}
90
91pub struct SerializedPane {
92    children: Vec<SerializedItem>,
93}
94
95pub enum SerializedItemKind {}
96
97pub enum SerializedItem {}