1use std::{
2 ffi::OsStr,
3 fmt::Display,
4 hash::Hash,
5 os::unix::prelude::OsStrExt,
6 path::{Path, PathBuf},
7 sync::Arc,
8};
9
10use anyhow::Result;
11use collections::HashSet;
12use rusqlite::{named_params, params, types::FromSql};
13
14use crate::workspace::WorkspaceId;
15
16use super::Db;
17
18/// Current design makes the cut at the item level,
19/// - Maybe A little more bottom up, serialize 'Terminals' and 'Editors' directly, and then make a seperate
20/// - items table, with a kind, and an integer that acts as a key to one of these other tables
21/// This column is a foreign key to ONE OF: editors, terminals, searches
22/// -
23
24// (workspace_id, item_id)
25// kind -> ::Editor::
26
27// ->
28// At the workspace level
29// -> (Workspace_ID, item_id)
30// -> One shot, big query, load everything up:
31
32// -> SerializedWorkspace::deserialize(tx, itemKey)
33// -> SerializedEditor::deserialize(tx, itemKey)
34
35// ->
36// -> Workspace::new(SerializedWorkspace)
37// -> Editor::new(serialized_workspace[???]serializedEditor)
38
39// //Pros: Keeps sql out of every body elese, makes changing it easier (e.g. for loading from a network or RocksDB)
40// //Cons: DB has to know the internals of the entire rest of the app
41
42// Workspace
43// Worktree roots
44// Pane groups
45// Dock
46// Items
47// Sidebars
48
49pub(crate) const ITEMS_M_1: &str = "
50CREATE TABLE items(
51 workspace_id INTEGER,
52 item_id INTEGER,
53 kind TEXT NOT NULL,
54 PRIMARY KEY (workspace_id, item_id)
55 FOREIGN KEY(workspace_id) REFERENCES workspace_ids(workspace_id)
56) STRICT;
57
58CREATE TABLE project_searches(
59 workspace_id INTEGER,
60 item_id INTEGER,
61 query TEXT,
62 PRIMARY KEY (workspace_id, item_id)
63 FOREIGN KEY(workspace_id) REFERENCES workspace_ids(workspace_id)
64) STRICT;
65
66CREATE TABLE editors(
67 workspace_id INTEGER,
68 item_id INTEGER,
69 path BLOB NOT NULL,
70 PRIMARY KEY (workspace_id, item_id)
71 FOREIGN KEY(workspace_id) REFERENCES workspace_ids(workspace_id)
72) STRICT;
73";
74
75#[derive(Debug, PartialEq, Eq)]
76pub struct ItemId {
77 workspace_id: usize,
78 item_id: usize,
79}
80
81enum SerializedItemKind {
82 Editor,
83 Diagnostics,
84 ProjectSearch,
85 Terminal,
86}
87
88struct SerializedItemRow {
89 kind: SerializedItemKind,
90 item_id: usize,
91 path: Option<Arc<Path>>,
92 query: Option<String>,
93}
94
95#[derive(Debug, PartialEq, Eq)]
96pub enum SerializedItem {
97 Editor { item_id: usize, path: Arc<Path> },
98 Diagnostics { item_id: usize },
99 ProjectSearch { item_id: usize, query: String },
100 Terminal { item_id: usize },
101}
102
103impl SerializedItem {
104 pub fn item_id(&self) -> usize {
105 match self {
106 SerializedItem::Editor { item_id, .. } => *item_id,
107 SerializedItem::Diagnostics { item_id } => *item_id,
108 SerializedItem::ProjectSearch { item_id, .. } => *item_id,
109 SerializedItem::Terminal { item_id } => *item_id,
110 }
111 }
112}
113
114impl Db {
115 pub fn get_item(&self, item_id: ItemId) -> SerializedItem {
116 unimplemented!()
117 }
118
119 pub fn save_item(&self, workspace_id: WorkspaceId, item: &SerializedItem) {}
120
121 pub fn close_item(&self, item_id: ItemId) {}
122}