items.rs

  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}