1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
4#[serde(rename_all = "camelCase")]
5pub 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")]
38pub 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")]
73pub 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")]
84pub 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")]
98pub 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")]
112pub 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")]
124pub 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")]
155pub 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")]
164pub 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")]
175pub 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")]
186pub 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")]
200pub 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")]
210pub struct FileDelete {
211 /// A file:// URI for the location of the file/folder being deleted.
212 pub uri: String,
213}
214