vscodehelper/storage_json/
window.rs

1use super::ui_state::UiState;
2use super::workspace::WorkspaceIdentifier;
3use crate::storage_json::uri::Uri;
4use serde::Deserialize;
5use serde::Serialize;
6use std::path::PathBuf;
7
8#[derive(Debug, Serialize)]
9#[serde(untagged)]
10pub enum Window {
11    FolderWindow {
12        folder: Uri,
13        #[serde(rename = "backupPath")]
14        backup_path: Option<PathBuf>,
15        #[serde(rename = "uiState")]
16        ui_state: UiState,
17    },
18    WorkspaceWindow {
19        #[serde(rename = "workspaceIdentifier")]
20        workspace_identifier: WorkspaceIdentifier,
21        #[serde(rename = "backupPath")]
22        backup_path: Option<PathBuf>,
23        #[serde(rename = "uiState")]
24        ui_state: UiState,
25    },
26}
27
28impl<'de> Deserialize<'de> for Window {
29    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
30    where
31        D: serde::Deserializer<'de>,
32    {
33        // Helper structs for each variant
34        #[derive(Deserialize)]
35        struct WorkspaceWindow {
36            #[serde(rename = "workspaceIdentifier")]
37            workspace_identifier: WorkspaceIdentifier,
38            #[serde(rename = "backupPath")]
39            backup_path: Option<PathBuf>,
40            #[serde(rename = "uiState")]
41            ui_state: UiState,
42        }
43
44        #[derive(Deserialize)]
45        struct FolderWindow {
46            folder: Uri,
47            #[serde(rename = "backupPath")]
48            backup_path: Option<PathBuf>,
49            #[serde(rename = "uiState")]
50            ui_state: UiState,
51        }
52
53        // First deserialize to a generic Value to inspect fields
54        let value = serde_json::Value::deserialize(deserializer)?;
55
56        if value.get("workspaceIdentifier").is_some() {
57            if value.get("folder").is_some() {
58                return Err(serde::de::Error::custom(
59                    "Window cannot have both 'workspaceIdentifier' and 'folder' fields",
60                ));
61            }
62
63            let window: WorkspaceWindow = serde_json::from_value(value)
64                .map_err(|e| serde::de::Error::custom(format!("Invalid WorkspaceWindow: {}", e)))?;
65
66            Ok(Window::WorkspaceWindow {
67                workspace_identifier: window.workspace_identifier,
68                backup_path: window.backup_path,
69                ui_state: window.ui_state,
70            })
71        } else if value.get("folder").is_some() {
72            let window: FolderWindow = serde_json::from_value(value)
73                .map_err(|e| serde::de::Error::custom(format!("Invalid FolderWindow: {}", e)))?;
74
75            Ok(Window::FolderWindow {
76                folder: window.folder,
77                backup_path: window.backup_path,
78                ui_state: window.ui_state,
79            })
80        } else {
81            Err(serde::de::Error::custom(
82                "Window must contain either 'workspaceIdentifier' or 'folder' field",
83            ))
84        }
85    }
86}