1 use serde::{Deserialize, Serialize};
2 
3 #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
4 #[serde(rename_all = "camelCase")]
5 pub struct WorkspaceFileOperationsClientCapabilities {
6     /// Whether the client supports dynamic registration for file
7     /// requests/notifications.
8     #[serde(skip_serializing_if = "Option::is_none")]
9     pub dynamic_registration: Option<bool>,
10 
11     /// The client has support for sending didCreateFiles notifications.
12     #[serde(skip_serializing_if = "Option::is_none")]
13     pub did_create: Option<bool>,
14 
15     /// The server is interested in receiving willCreateFiles requests.
16     #[serde(skip_serializing_if = "Option::is_none")]
17     pub will_create: Option<bool>,
18 
19     /// The server is interested in receiving didRenameFiles requests.
20     #[serde(skip_serializing_if = "Option::is_none")]
21     pub did_rename: Option<bool>,
22 
23     /// The server is interested in receiving willRenameFiles requests.
24     #[serde(skip_serializing_if = "Option::is_none")]
25     pub will_rename: Option<bool>,
26 
27     /// The server is interested in receiving didDeleteFiles requests.
28     #[serde(skip_serializing_if = "Option::is_none")]
29     pub did_delete: Option<bool>,
30 
31     /// The server is interested in receiving willDeleteFiles requests.
32     #[serde(skip_serializing_if = "Option::is_none")]
33     pub will_delete: Option<bool>,
34 }
35 
36 #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
37 #[serde(rename_all = "camelCase")]
38 pub struct WorkspaceFileOperationsServerCapabilities {
39     /// The server is interested in receiving didCreateFiles
40     /// notifications.
41     #[serde(skip_serializing_if = "Option::is_none")]
42     pub did_create: Option<FileOperationRegistrationOptions>,
43 
44     /// The server is interested in receiving willCreateFiles requests.
45     #[serde(skip_serializing_if = "Option::is_none")]
46     pub will_create: Option<FileOperationRegistrationOptions>,
47 
48     /// The server is interested in receiving didRenameFiles
49     /// notifications.
50     #[serde(skip_serializing_if = "Option::is_none")]
51     pub did_rename: Option<FileOperationRegistrationOptions>,
52 
53     /// The server is interested in receiving willRenameFiles requests.
54     #[serde(skip_serializing_if = "Option::is_none")]
55     pub will_rename: Option<FileOperationRegistrationOptions>,
56 
57     /// The server is interested in receiving didDeleteFiles file
58     /// notifications.
59     #[serde(skip_serializing_if = "Option::is_none")]
60     pub did_delete: Option<FileOperationRegistrationOptions>,
61 
62     /// The server is interested in receiving willDeleteFiles file
63     /// requests.
64     #[serde(skip_serializing_if = "Option::is_none")]
65     pub will_delete: Option<FileOperationRegistrationOptions>,
66 }
67 
68 /// The options to register for file operations.
69 ///
70 /// @since 3.16.0
71 #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
72 #[serde(rename_all = "camelCase")]
73 pub struct FileOperationRegistrationOptions {
74     /// The actual filters.
75     pub filters: Vec<FileOperationFilter>,
76 }
77 
78 /// A filter to describe in which file operation requests or notifications
79 /// the server is interested in.
80 ///
81 /// @since 3.16.0
82 #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
83 #[serde(rename_all = "camelCase")]
84 pub struct FileOperationFilter {
85     /// A Uri like `file` or `untitled`.
86     pub scheme: Option<String>,
87 
88     /// The actual file operation pattern.
89     pub pattern: FileOperationPattern,
90 }
91 
92 /// A pattern kind describing if a glob pattern matches a file a folder or
93 ///  both.
94 ///
95 ///  @since 3.16.0
96 #[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
97 #[serde(rename_all = "lowercase")]
98 pub enum FileOperationPatternKind {
99     /// The pattern matches a file only.
100     File,
101 
102     /// The pattern matches a folder only.
103     Folder,
104 }
105 
106 /// Matching options for the file operation pattern.
107 ///
108 /// @since 3.16.0
109 ///
110 #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
111 #[serde(rename_all = "camelCase")]
112 pub struct FileOperationPatternOptions {
113     /// The pattern should be matched ignoring casing.
114     #[serde(skip_serializing_if = "Option::is_none")]
115     pub ignore_case: Option<bool>,
116 }
117 
118 /// A pattern to describe in which file operation requests or notifications
119 /// the server is interested in.
120 ///
121 /// @since 3.16.0
122 #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
123 #[serde(rename_all = "camelCase")]
124 pub struct FileOperationPattern {
125     /// The glob pattern to match. Glob patterns can have the following syntax:
126     /// - `*` to match one or more characters in a path segment
127     /// - `?` to match on one character in a path segment
128     /// - `**` to match any number of path segments, including none
129     /// - `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript
130     ///   and JavaScript files)
131     /// - `[]` to declare a range of characters to match in a path segment
132     ///   (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
133     /// - `[!...]` to negate a range of characters to match in a path segment
134     ///   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but
135     ///   not `example.0`)
136     pub glob: String,
137 
138     /// Whether to match files or folders with this pattern.
139     ///
140     /// Matches both if undefined.
141     #[serde(skip_serializing_if = "Option::is_none")]
142     pub matches: Option<FileOperationPatternKind>,
143 
144     /// Additional options used during matching.
145     #[serde(skip_serializing_if = "Option::is_none")]
146     pub options: Option<FileOperationPatternOptions>,
147 }
148 
149 /// The parameters sent in notifications/requests for user-initiated creation
150 ///  of files.
151 ///
152 ///  @since 3.16.0
153 #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
154 #[serde(rename_all = "camelCase")]
155 pub struct CreateFilesParams {
156     /// An array of all files/folders created in this operation.
157     pub files: Vec<FileCreate>,
158 }
159 /// Represents information on a file/folder create.
160 ///
161 /// @since 3.16.0
162 #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
163 #[serde(rename_all = "camelCase")]
164 pub struct FileCreate {
165     /// A file:// URI for the location of the file/folder being created.
166     pub uri: String,
167 }
168 
169 /// The parameters sent in notifications/requests for user-initiated renames
170 /// of files.
171 ///
172 /// @since 3.16.0
173 #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
174 #[serde(rename_all = "camelCase")]
175 pub struct RenameFilesParams {
176     /// An array of all files/folders renamed in this operation. When a folder
177     /// is renamed, only the folder will be included, and not its children.
178     pub files: Vec<FileRename>,
179 }
180 
181 /// Represents information on a file/folder rename.
182 ///
183 /// @since 3.16.0
184 #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
185 #[serde(rename_all = "camelCase")]
186 pub struct FileRename {
187     /// A file:// URI for the original location of the file/folder being renamed.
188     pub old_uri: String,
189 
190     /// A file:// URI for the new location of the file/folder being renamed.
191     pub new_uri: String,
192 }
193 
194 /// The parameters sent in notifications/requests for user-initiated deletes
195 /// of files.
196 ///
197 /// @since 3.16.0
198 #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
199 #[serde(rename_all = "camelCase")]
200 pub struct DeleteFilesParams {
201     /// An array of all files/folders deleted in this operation.
202     pub files: Vec<FileDelete>,
203 }
204 
205 /// Represents information on a file/folder delete.
206 ///
207 /// @since 3.16.0
208 #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
209 #[serde(rename_all = "camelCase")]
210 pub struct FileDelete {
211     /// A file:// URI for the location of the file/folder being deleted.
212     pub uri: String,
213 }
214