Skip to main content

timeweb_rs/apis/
network_drives_api.rs

1/*
2 * Документация публичного API
3 *
4 * # Введение API Timeweb Cloud позволяет вам управлять ресурсами в облаке программным способом с использованием обычных HTTP-запросов.  Множество функций, которые доступны в панели управления Timeweb Cloud, также доступны через API, что позволяет вам автоматизировать ваши собственные сценарии.  В этой документации сперва будет описан общий дизайн и принципы работы API, а после этого конкретные конечные точки. Также будут приведены примеры запросов к ним.   ## Запросы Запросы должны выполняться по протоколу `HTTPS`, чтобы гарантировать шифрование транзакций. Поддерживаются следующие методы запроса: |Метод|Применение| |--- |--- | |GET|Извлекает данные о коллекциях и отдельных ресурсах.| |POST|Для коллекций создает новый ресурс этого типа. Также используется для выполнения действий с конкретным ресурсом.| |PUT|Обновляет существующий ресурс.| |PATCH|Некоторые ресурсы поддерживают частичное обновление, то есть обновление только части атрибутов ресурса, в этом случае вместо метода PUT будет использован PATCH.| |DELETE|Удаляет ресурс.|  Методы `POST`, `PUT` и `PATCH` могут включать объект в тело запроса с типом содержимого `application/json`.  ### Параметры в запросах Некоторые коллекции поддерживают пагинацию, поиск или сортировку в запросах. В параметрах запроса требуется передать: - `limit` — обозначает количество записей, которое необходимо вернуть  - `offset` — указывает на смещение, относительно начала списка  - `search` — позволяет указать набор символов для поиска  - `sort` — можно задать правило сортировки коллекции  ## Ответы Запросы вернут один из следующих кодов состояния ответа HTTP:  |Статус|Описание| |--- |--- | |200 OK|Действие с ресурсом было выполнено успешно.| |201 Created|Ресурс был успешно создан. При этом ресурс может быть как уже готовым к использованию, так и находиться в процессе запуска.| |204 No Content|Действие с ресурсом было выполнено успешно, и ответ не содержит дополнительной информации в теле.| |400 Bad Request|Был отправлен неверный запрос, например, в нем отсутствуют обязательные параметры и т. д. Тело ответа будет содержать дополнительную информацию об ошибке.| |401 Unauthorized|Ошибка аутентификации.| |403 Forbidden|Аутентификация прошла успешно, но недостаточно прав для выполнения действия.| |404 Not Found|Запрашиваемый ресурс не найден.| |409 Conflict|Запрос конфликтует с текущим состоянием.| |423 Locked|Ресурс из запроса заблокирован от применения к нему указанного метода.| |429 Too Many Requests|Был достигнут лимит по количеству запросов в единицу времени.| |500 Internal Server Error|При выполнении запроса произошла какая-то внутренняя ошибка. Чтобы решить эту проблему, лучше всего создать тикет в панели управления.|  ### Структура успешного ответа Все конечные точки будут возвращать данные в формате `JSON`. Ответы на `GET`-запросы будут иметь на верхнем уровне следующую структуру атрибутов:  |Название поля|Тип|Описание| |--- |--- |--- | |[entity_name]|object, object[], string[], number[], boolean|Динамическое поле, которое будет меняться в зависимости от запрашиваемого ресурса и будет содержать все атрибуты, необходимые для описания этого ресурса. Например, при запросе списка баз данных будет возвращаться поле `dbs`, а при запросе конкретного облачного сервера `server`. Для некоторых конечных точек в ответе может возвращаться сразу несколько ресурсов.| |meta|object|Опционально. Объект, который содержит вспомогательную информацию о ресурсе. Чаще всего будет встречаться при запросе коллекций и содержать поле `total`, которое будет указывать на количество элементов в коллекции.| |response_id|string|Опционально. В большинстве случаев в ответе будет содержаться ID ответа в формате UUIDv4, который однозначно указывает на ваш запрос внутри нашей системы. Если вам потребуется задать вопрос нашей поддержке, приложите к вопросу этот ID— так мы сможем найти ответ на него намного быстрее. Также вы можете использовать этот ID, чтобы убедиться, что это новый ответ на запрос и результат не был получен из кэша.|  Пример запроса на получение списка SSH-ключей: ```     HTTP/2.0 200 OK     {       \"ssh_keys\":[           {             \"body\":\"ssh-rsa AAAAB3NzaC1sdfghjkOAsBwWhs= example@device.local\",             \"created_at\":\"2021-09-15T19:52:27Z\",             \"expired_at\":null,             \"id\":5297,             \"is_default\":false,             \"name\":\"example@device.local\",             \"used_at\":null,             \"used_by\":[]           }       ],       \"meta\":{           \"total\":1       },       \"response_id\":\"94608d15-8672-4eed-8ab6-28bd6fa3cdf7\"     } ```  ### Структура ответа с ошибкой |Название поля|Тип|Описание| |--- |--- |--- | |status_code|number|Короткий числовой идентификатор ошибки.| |error_code|string|Короткий текстовый идентификатор ошибки, который уточняет числовой идентификатор и удобен для программной обработки. Самый простой пример — это код `not_found` для ошибки 404.| |message|string, string[]|Опционально. В большинстве случаев в ответе будет содержаться человекочитаемое подробное описание ошибки или ошибок, которые помогут понять, что нужно исправить.| |response_id|string|Опционально. В большинстве случае в ответе будет содержаться ID ответа в формате UUIDv4, который однозначно указывает на ваш запрос внутри нашей системы. Если вам потребуется задать вопрос нашей поддержке, приложите к вопросу этот ID — так мы сможем найти ответ на него намного быстрее.|  Пример: ```     HTTP/2.0 403 Forbidden     {       \"status_code\": 403,       \"error_code\":  \"forbidden\",       \"message\":     \"You do not have access for the attempted action\",       \"response_id\": \"94608d15-8672-4eed-8ab6-28bd6fa3cdf7\"     } ```  ## Статусы ресурсов Важно учесть, что при создании большинства ресурсов внутри платформы вам будет сразу возвращен ответ от сервера со статусом `200 OK` или `201 Created` и ID созданного ресурса в теле ответа, но при этом этот ресурс может быть ещё в *состоянии запуска*.  Для того чтобы понять, в каком состоянии сейчас находится ваш ресурс, мы добавили поле `status` в ответ на получение информации о ресурсе.  Список статусов будет отличаться в зависимости от типа ресурса. Увидеть поддерживаемый список статусов вы сможете в описании каждого конкретного ресурса.     ## Ограничение скорости запросов (Rate Limiting) Чтобы обеспечить стабильность для всех пользователей, Timeweb Cloud защищает API от всплесков входящего трафика, анализируя количество запросов c каждого аккаунта к каждой конечной точке.  Если ваше приложение отправляет более 20 запросов в секунду на одну конечную точку, то для этого запроса API может вернуть код состояния HTTP `429 Too Many Requests`.   ## Аутентификация Доступ к API осуществляется с помощью JWT-токена. Токенами можно управлять внутри панели управления Timeweb Cloud в разделе *API и Terraform*.  Токен необходимо передавать в заголовке каждого запроса в формате: ```   Authorization: Bearer $TIMEWEB_CLOUD_TOKEN ```  ## Формат примеров API Примеры в этой документации описаны с помощью `curl`, HTTP-клиента командной строки. На компьютерах `Linux` и `macOS` обычно по умолчанию установлен `curl`, и он доступен для загрузки на всех популярных платформах, включая `Windows`.  Каждый пример разделен на несколько строк символом `\\`, который совместим с `bash`. Типичный пример выглядит так: ```   curl -X PATCH      -H \"Content-Type: application/json\"      -H \"Authorization: Bearer $TIMEWEB_CLOUD_TOKEN\"      -d '{\"name\":\"Cute Corvus\",\"comment\":\"Development Server\"}'      \"https://api.timeweb.cloud/api/v1/dedicated/1051\" ``` - Параметр `-X` задает метод запроса. Для согласованности метод будет указан во всех примерах, даже если он явно не требуется для методов `GET`. - Строки `-H` задают требуемые HTTP-заголовки. - Примеры, для которых требуется объект JSON в теле запроса, передают требуемые данные через параметр `-d`.  Чтобы использовать приведенные примеры, не подставляя каждый раз в них свой токен, вы можете добавить токен один раз в переменные окружения в вашей консоли. Например, на `Linux` это можно сделать с помощью команды:  ``` TIMEWEB_CLOUD_TOKEN=\"token\" ```  После этого токен будет автоматически подставляться в ваши запросы.  Обратите внимание, что все значения в этой документации являются примерами. Не полагайтесь на IDы операционных систем, тарифов и т.д., используемые в примерах. Используйте соответствующую конечную точку для получения значений перед созданием ресурсов.   ## Версионирование API построено согласно принципам [семантического версионирования](https://semver.org/lang/ru). Это значит, что мы гарантируем обратную совместимость всех изменений в пределах одной мажорной версии.  Мажорная версия каждой конечной точки обозначается в пути запроса, например, запрос `/api/v1/servers` указывает, что этот метод имеет версию 1.
5 *
6 * The version of the OpenAPI document: 1.0.0
7 * Contact: info@timeweb.cloud
8 * Generated by: https://openapi-generator.tech
9 */
10
11use reqwest;
12use serde::{Deserialize, Serialize, de::Error as _};
13
14use super::{ContentType, Error, configuration};
15use crate::{apis::ResponseContent, models};
16
17/// struct for typed errors of method [`create_network_drive`]
18#[derive(Debug, Clone, Serialize, Deserialize)]
19#[serde(untagged)]
20pub enum CreateNetworkDriveError {
21    Status400(models::GetFinances400Response),
22    Status401(models::GetFinances401Response),
23    Status403(models::GetAccountStatus403Response),
24    Status409(models::CreateDatabaseBackup409Response),
25    Status429(models::GetFinances429Response),
26    Status500(models::GetFinances500Response),
27    UnknownValue(serde_json::Value)
28}
29
30/// struct for typed errors of method [`delete_network_drive`]
31#[derive(Debug, Clone, Serialize, Deserialize)]
32#[serde(untagged)]
33pub enum DeleteNetworkDriveError {
34    Status400(models::GetFinances400Response),
35    Status401(models::GetFinances401Response),
36    Status403(models::GetAccountStatus403Response),
37    Status404(models::GetImage404Response),
38    Status429(models::GetFinances429Response),
39    Status500(models::GetFinances500Response),
40    UnknownValue(serde_json::Value)
41}
42
43/// struct for typed errors of method [`get_network_drive`]
44#[derive(Debug, Clone, Serialize, Deserialize)]
45#[serde(untagged)]
46pub enum GetNetworkDriveError {
47    Status400(models::GetFinances400Response),
48    Status401(models::GetFinances401Response),
49    Status403(models::GetAccountStatus403Response),
50    Status404(models::GetImage404Response),
51    Status429(models::GetFinances429Response),
52    Status500(models::GetFinances500Response),
53    UnknownValue(serde_json::Value)
54}
55
56/// struct for typed errors of method [`get_network_drives`]
57#[derive(Debug, Clone, Serialize, Deserialize)]
58#[serde(untagged)]
59pub enum GetNetworkDrivesError {
60    Status400(models::GetFinances400Response),
61    Status401(models::GetFinances401Response),
62    Status403(models::GetAccountStatus403Response),
63    Status404(models::GetImage404Response),
64    Status429(models::GetFinances429Response),
65    Status500(models::GetFinances500Response),
66    UnknownValue(serde_json::Value)
67}
68
69/// struct for typed errors of method [`get_network_drives_available_resources`]
70#[derive(Debug, Clone, Serialize, Deserialize)]
71#[serde(untagged)]
72pub enum GetNetworkDrivesAvailableResourcesError {
73    Status400(models::GetFinances400Response),
74    Status401(models::GetFinances401Response),
75    Status403(models::GetAccountStatus403Response),
76    Status404(models::GetImage404Response),
77    Status429(models::GetFinances429Response),
78    Status500(models::GetFinances500Response),
79    UnknownValue(serde_json::Value)
80}
81
82/// struct for typed errors of method [`get_network_drives_presets`]
83#[derive(Debug, Clone, Serialize, Deserialize)]
84#[serde(untagged)]
85pub enum GetNetworkDrivesPresetsError {
86    Status400(models::GetFinances400Response),
87    Status401(models::GetFinances401Response),
88    Status403(models::GetAccountStatus403Response),
89    Status404(models::GetImage404Response),
90    Status429(models::GetFinances429Response),
91    Status500(models::GetFinances500Response),
92    UnknownValue(serde_json::Value)
93}
94
95/// struct for typed errors of method [`mount_network_drive`]
96#[derive(Debug, Clone, Serialize, Deserialize)]
97#[serde(untagged)]
98pub enum MountNetworkDriveError {
99    Status400(models::GetFinances400Response),
100    Status401(models::GetFinances401Response),
101    Status403(models::GetAccountStatus403Response),
102    Status404(models::GetImage404Response),
103    Status429(models::GetFinances429Response),
104    Status500(models::GetFinances500Response),
105    UnknownValue(serde_json::Value)
106}
107
108/// struct for typed errors of method [`unmount_network_drive`]
109#[derive(Debug, Clone, Serialize, Deserialize)]
110#[serde(untagged)]
111pub enum UnmountNetworkDriveError {
112    Status400(models::GetFinances400Response),
113    Status401(models::GetFinances401Response),
114    Status403(models::GetAccountStatus403Response),
115    Status404(models::GetImage404Response),
116    Status429(models::GetFinances429Response),
117    Status500(models::GetFinances500Response),
118    UnknownValue(serde_json::Value)
119}
120
121/// struct for typed errors of method [`update_network_drive`]
122#[derive(Debug, Clone, Serialize, Deserialize)]
123#[serde(untagged)]
124pub enum UpdateNetworkDriveError {
125    Status400(models::GetFinances400Response),
126    Status401(models::GetFinances401Response),
127    Status403(models::GetAccountStatus403Response),
128    Status404(models::GetImage404Response),
129    Status429(models::GetFinances429Response),
130    Status500(models::GetFinances500Response),
131    UnknownValue(serde_json::Value)
132}
133
134/// Чтобы создать создать сетевой диск, отправьте POST-запрос в
135/// `/api/v1/network-drives`, задав необходимые атрибуты.
136pub async fn create_network_drive(
137    configuration: &configuration::Configuration,
138    create_network_drive: models::CreateNetworkDrive
139) -> Result<models::CreateNetworkDrive201Response, Error<CreateNetworkDriveError>> {
140    // add a prefix to parameters to efficiently prevent name collisions
141    let p_body_create_network_drive = create_network_drive;
142
143    let uri_str = format!("{}/api/v1/network-drives", configuration.base_path);
144    let mut req_builder = configuration
145        .client
146        .request(reqwest::Method::POST, &uri_str);
147
148    if let Some(ref user_agent) = configuration.user_agent {
149        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
150    }
151    if let Some(ref token) = configuration.bearer_access_token {
152        req_builder = req_builder.bearer_auth(token.to_owned());
153    };
154    req_builder = req_builder.json(&p_body_create_network_drive);
155
156    let req = req_builder.build()?;
157    let resp = configuration.client.execute(req).await?;
158
159    let status = resp.status();
160    let content_type = resp
161        .headers()
162        .get("content-type")
163        .and_then(|v| v.to_str().ok())
164        .unwrap_or("application/octet-stream");
165    let content_type = super::ContentType::from(content_type);
166
167    if !status.is_client_error() && !status.is_server_error() {
168        let content = resp.text().await?;
169        match content_type {
170            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
171            ContentType::Text => {
172                return Err(Error::from(serde_json::Error::custom(
173                    "Received `text/plain` content type response that cannot be converted to `models::CreateNetworkDrive201Response`"
174                )));
175            }
176            ContentType::Unsupported(unknown_type) => {
177                return Err(Error::from(serde_json::Error::custom(format!(
178                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateNetworkDrive201Response`"
179                ))));
180            }
181        }
182    } else {
183        let content = resp.text().await?;
184        let entity: Option<CreateNetworkDriveError> = serde_json::from_str(&content).ok();
185        Err(Error::ResponseError(ResponseContent {
186            status,
187            content,
188            entity
189        }))
190    }
191}
192
193/// Чтобы удалить сетевой диск, отправьте DELETE-запрос на
194/// `/api/v1/network-drives/{network_drive_id}`
195pub async fn delete_network_drive(
196    configuration: &configuration::Configuration,
197    network_drive_id: &str
198) -> Result<(), Error<DeleteNetworkDriveError>> {
199    // add a prefix to parameters to efficiently prevent name collisions
200    let p_path_network_drive_id = network_drive_id;
201
202    let uri_str = format!(
203        "{}/api/v1/network-drives/{network_drive_id}",
204        configuration.base_path,
205        network_drive_id = crate::apis::urlencode(p_path_network_drive_id)
206    );
207    let mut req_builder = configuration
208        .client
209        .request(reqwest::Method::DELETE, &uri_str);
210
211    if let Some(ref user_agent) = configuration.user_agent {
212        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
213    }
214    if let Some(ref token) = configuration.bearer_access_token {
215        req_builder = req_builder.bearer_auth(token.to_owned());
216    };
217
218    let req = req_builder.build()?;
219    let resp = configuration.client.execute(req).await?;
220
221    let status = resp.status();
222
223    if !status.is_client_error() && !status.is_server_error() {
224        Ok(())
225    } else {
226        let content = resp.text().await?;
227        let entity: Option<DeleteNetworkDriveError> = serde_json::from_str(&content).ok();
228        Err(Error::ResponseError(ResponseContent {
229            status,
230            content,
231            entity
232        }))
233    }
234}
235
236/// Чтобы отобразить информацию об отдельном сетевом диске, отправьте запрос GET
237/// на `api/v1/network-drives/{network_drive_id}`.
238pub async fn get_network_drive(
239    configuration: &configuration::Configuration,
240    network_drive_id: &str
241) -> Result<models::CreateNetworkDrive201Response, Error<GetNetworkDriveError>> {
242    // add a prefix to parameters to efficiently prevent name collisions
243    let p_path_network_drive_id = network_drive_id;
244
245    let uri_str = format!(
246        "{}/api/v1/network-drives/{network_drive_id}",
247        configuration.base_path,
248        network_drive_id = crate::apis::urlencode(p_path_network_drive_id)
249    );
250    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
251
252    if let Some(ref user_agent) = configuration.user_agent {
253        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
254    }
255    if let Some(ref token) = configuration.bearer_access_token {
256        req_builder = req_builder.bearer_auth(token.to_owned());
257    };
258
259    let req = req_builder.build()?;
260    let resp = configuration.client.execute(req).await?;
261
262    let status = resp.status();
263    let content_type = resp
264        .headers()
265        .get("content-type")
266        .and_then(|v| v.to_str().ok())
267        .unwrap_or("application/octet-stream");
268    let content_type = super::ContentType::from(content_type);
269
270    if !status.is_client_error() && !status.is_server_error() {
271        let content = resp.text().await?;
272        match content_type {
273            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
274            ContentType::Text => {
275                return Err(Error::from(serde_json::Error::custom(
276                    "Received `text/plain` content type response that cannot be converted to `models::CreateNetworkDrive201Response`"
277                )));
278            }
279            ContentType::Unsupported(unknown_type) => {
280                return Err(Error::from(serde_json::Error::custom(format!(
281                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateNetworkDrive201Response`"
282                ))));
283            }
284        }
285    } else {
286        let content = resp.text().await?;
287        let entity: Option<GetNetworkDriveError> = serde_json::from_str(&content).ok();
288        Err(Error::ResponseError(ResponseContent {
289            status,
290            content,
291            entity
292        }))
293    }
294}
295
296/// Чтобы получить список сетевых дисков, отправьте GET-запрос на
297/// `/api/v1/network-drives`.
298pub async fn get_network_drives(
299    configuration: &configuration::Configuration
300) -> Result<models::GetNetworkDrives200Response, Error<GetNetworkDrivesError>> {
301    let uri_str = format!("{}/api/v1/network-drives", configuration.base_path);
302    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
303
304    if let Some(ref user_agent) = configuration.user_agent {
305        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
306    }
307    if let Some(ref token) = configuration.bearer_access_token {
308        req_builder = req_builder.bearer_auth(token.to_owned());
309    };
310
311    let req = req_builder.build()?;
312    let resp = configuration.client.execute(req).await?;
313
314    let status = resp.status();
315    let content_type = resp
316        .headers()
317        .get("content-type")
318        .and_then(|v| v.to_str().ok())
319        .unwrap_or("application/octet-stream");
320    let content_type = super::ContentType::from(content_type);
321
322    if !status.is_client_error() && !status.is_server_error() {
323        let content = resp.text().await?;
324        match content_type {
325            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
326            ContentType::Text => {
327                return Err(Error::from(serde_json::Error::custom(
328                    "Received `text/plain` content type response that cannot be converted to `models::GetNetworkDrives200Response`"
329                )));
330            }
331            ContentType::Unsupported(unknown_type) => {
332                return Err(Error::from(serde_json::Error::custom(format!(
333                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetNetworkDrives200Response`"
334                ))));
335            }
336        }
337    } else {
338        let content = resp.text().await?;
339        let entity: Option<GetNetworkDrivesError> = serde_json::from_str(&content).ok();
340        Err(Error::ResponseError(ResponseContent {
341            status,
342            content,
343            entity
344        }))
345    }
346}
347
348/// Чтобы получить список сервисов, отправьте GET-запрос на
349/// `/api/v1/network-drives/available-resources`.
350pub async fn get_network_drives_available_resources(
351    configuration: &configuration::Configuration
352) -> Result<
353    models::GetNetworkDrivesAvailableResources200Response,
354    Error<GetNetworkDrivesAvailableResourcesError>
355> {
356    let uri_str = format!(
357        "{}/api/v1/network-drives/available-resources",
358        configuration.base_path
359    );
360    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
361
362    if let Some(ref user_agent) = configuration.user_agent {
363        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
364    }
365    if let Some(ref token) = configuration.bearer_access_token {
366        req_builder = req_builder.bearer_auth(token.to_owned());
367    };
368
369    let req = req_builder.build()?;
370    let resp = configuration.client.execute(req).await?;
371
372    let status = resp.status();
373    let content_type = resp
374        .headers()
375        .get("content-type")
376        .and_then(|v| v.to_str().ok())
377        .unwrap_or("application/octet-stream");
378    let content_type = super::ContentType::from(content_type);
379
380    if !status.is_client_error() && !status.is_server_error() {
381        let content = resp.text().await?;
382        match content_type {
383            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
384            ContentType::Text => {
385                return Err(Error::from(serde_json::Error::custom(
386                    "Received `text/plain` content type response that cannot be converted to `models::GetNetworkDrivesAvailableResources200Response`"
387                )));
388            }
389            ContentType::Unsupported(unknown_type) => {
390                return Err(Error::from(serde_json::Error::custom(format!(
391                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetNetworkDrivesAvailableResources200Response`"
392                ))));
393            }
394        }
395    } else {
396        let content = resp.text().await?;
397        let entity: Option<GetNetworkDrivesAvailableResourcesError> =
398            serde_json::from_str(&content).ok();
399        Err(Error::ResponseError(ResponseContent {
400            status,
401            content,
402            entity
403        }))
404    }
405}
406
407/// Чтобы получить список тарифов, отправьте GET-запрос на
408/// `/api/v1/presets/network-drives`.
409pub async fn get_network_drives_presets(
410    configuration: &configuration::Configuration
411) -> Result<models::GetNetworkDrivesPresets200Response, Error<GetNetworkDrivesPresetsError>> {
412    let uri_str = format!("{}/api/v1/presets/network-drives", configuration.base_path);
413    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
414
415    if let Some(ref user_agent) = configuration.user_agent {
416        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
417    }
418    if let Some(ref token) = configuration.bearer_access_token {
419        req_builder = req_builder.bearer_auth(token.to_owned());
420    };
421
422    let req = req_builder.build()?;
423    let resp = configuration.client.execute(req).await?;
424
425    let status = resp.status();
426    let content_type = resp
427        .headers()
428        .get("content-type")
429        .and_then(|v| v.to_str().ok())
430        .unwrap_or("application/octet-stream");
431    let content_type = super::ContentType::from(content_type);
432
433    if !status.is_client_error() && !status.is_server_error() {
434        let content = resp.text().await?;
435        match content_type {
436            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
437            ContentType::Text => {
438                return Err(Error::from(serde_json::Error::custom(
439                    "Received `text/plain` content type response that cannot be converted to `models::GetNetworkDrivesPresets200Response`"
440                )));
441            }
442            ContentType::Unsupported(unknown_type) => {
443                return Err(Error::from(serde_json::Error::custom(format!(
444                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetNetworkDrivesPresets200Response`"
445                ))));
446            }
447        }
448    } else {
449        let content = resp.text().await?;
450        let entity: Option<GetNetworkDrivesPresetsError> = serde_json::from_str(&content).ok();
451        Err(Error::ResponseError(ResponseContent {
452            status,
453            content,
454            entity
455        }))
456    }
457}
458
459/// Чтобы подключить сетевой диск к сервису, отправьте POST-запрос на
460/// `/api/v1/network-drives/{network_drive_id}/mount`.
461pub async fn mount_network_drive(
462    configuration: &configuration::Configuration,
463    network_drive_id: &str,
464    mount_network_drive: models::MountNetworkDrive
465) -> Result<(), Error<MountNetworkDriveError>> {
466    // add a prefix to parameters to efficiently prevent name collisions
467    let p_path_network_drive_id = network_drive_id;
468    let p_body_mount_network_drive = mount_network_drive;
469
470    let uri_str = format!(
471        "{}/api/v1/network-drives/{network_drive_id}/mount",
472        configuration.base_path,
473        network_drive_id = crate::apis::urlencode(p_path_network_drive_id)
474    );
475    let mut req_builder = configuration
476        .client
477        .request(reqwest::Method::POST, &uri_str);
478
479    if let Some(ref user_agent) = configuration.user_agent {
480        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
481    }
482    if let Some(ref token) = configuration.bearer_access_token {
483        req_builder = req_builder.bearer_auth(token.to_owned());
484    };
485    req_builder = req_builder.json(&p_body_mount_network_drive);
486
487    let req = req_builder.build()?;
488    let resp = configuration.client.execute(req).await?;
489
490    let status = resp.status();
491
492    if !status.is_client_error() && !status.is_server_error() {
493        Ok(())
494    } else {
495        let content = resp.text().await?;
496        let entity: Option<MountNetworkDriveError> = serde_json::from_str(&content).ok();
497        Err(Error::ResponseError(ResponseContent {
498            status,
499            content,
500            entity
501        }))
502    }
503}
504
505/// Чтобы отключить сетевой диск от сервиса, отправьте POST-запрос на
506/// `/api/v1/network-drives/{network_drive_id}/unmount`.
507pub async fn unmount_network_drive(
508    configuration: &configuration::Configuration,
509    network_drive_id: &str
510) -> Result<(), Error<UnmountNetworkDriveError>> {
511    // add a prefix to parameters to efficiently prevent name collisions
512    let p_path_network_drive_id = network_drive_id;
513
514    let uri_str = format!(
515        "{}/api/v1/network-drives/{network_drive_id}/unmount",
516        configuration.base_path,
517        network_drive_id = crate::apis::urlencode(p_path_network_drive_id)
518    );
519    let mut req_builder = configuration
520        .client
521        .request(reqwest::Method::POST, &uri_str);
522
523    if let Some(ref user_agent) = configuration.user_agent {
524        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
525    }
526    if let Some(ref token) = configuration.bearer_access_token {
527        req_builder = req_builder.bearer_auth(token.to_owned());
528    };
529
530    let req = req_builder.build()?;
531    let resp = configuration.client.execute(req).await?;
532
533    let status = resp.status();
534
535    if !status.is_client_error() && !status.is_server_error() {
536        Ok(())
537    } else {
538        let content = resp.text().await?;
539        let entity: Option<UnmountNetworkDriveError> = serde_json::from_str(&content).ok();
540        Err(Error::ResponseError(ResponseContent {
541            status,
542            content,
543            entity
544        }))
545    }
546}
547
548/// Чтобы изменить сетевой диск, отправьте PATCH-запрос на
549/// `/api/v1/network-drives/{network_drive_id}`
550pub async fn update_network_drive(
551    configuration: &configuration::Configuration,
552    network_drive_id: &str,
553    update_network_drive: models::UpdateNetworkDrive
554) -> Result<models::CreateNetworkDrive201Response, Error<UpdateNetworkDriveError>> {
555    // add a prefix to parameters to efficiently prevent name collisions
556    let p_path_network_drive_id = network_drive_id;
557    let p_body_update_network_drive = update_network_drive;
558
559    let uri_str = format!(
560        "{}/api/v1/network-drives/{network_drive_id}",
561        configuration.base_path,
562        network_drive_id = crate::apis::urlencode(p_path_network_drive_id)
563    );
564    let mut req_builder = configuration
565        .client
566        .request(reqwest::Method::PATCH, &uri_str);
567
568    if let Some(ref user_agent) = configuration.user_agent {
569        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
570    }
571    if let Some(ref token) = configuration.bearer_access_token {
572        req_builder = req_builder.bearer_auth(token.to_owned());
573    };
574    req_builder = req_builder.json(&p_body_update_network_drive);
575
576    let req = req_builder.build()?;
577    let resp = configuration.client.execute(req).await?;
578
579    let status = resp.status();
580    let content_type = resp
581        .headers()
582        .get("content-type")
583        .and_then(|v| v.to_str().ok())
584        .unwrap_or("application/octet-stream");
585    let content_type = super::ContentType::from(content_type);
586
587    if !status.is_client_error() && !status.is_server_error() {
588        let content = resp.text().await?;
589        match content_type {
590            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
591            ContentType::Text => {
592                return Err(Error::from(serde_json::Error::custom(
593                    "Received `text/plain` content type response that cannot be converted to `models::CreateNetworkDrive201Response`"
594                )));
595            }
596            ContentType::Unsupported(unknown_type) => {
597                return Err(Error::from(serde_json::Error::custom(format!(
598                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateNetworkDrive201Response`"
599                ))));
600            }
601        }
602    } else {
603        let content = resp.text().await?;
604        let entity: Option<UpdateNetworkDriveError> = serde_json::from_str(&content).ok();
605        Err(Error::ResponseError(ResponseContent {
606            status,
607            content,
608            entity
609        }))
610    }
611}