vscodehelper/storage_json/
window.rs1use 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 #[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 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}