Skip to main content

timeweb_rs/apis/
projects_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 [`add_balancer_to_project`]
18#[derive(Debug, Clone, Serialize, Deserialize)]
19#[serde(untagged)]
20pub enum AddBalancerToProjectError {
21    Status400(models::GetFinances400Response),
22    Status401(models::GetFinances401Response),
23    Status403(models::GetAccountStatus403Response),
24    Status404(models::GetImage404Response),
25    Status429(models::GetFinances429Response),
26    Status500(models::GetFinances500Response),
27    UnknownValue(serde_json::Value)
28}
29
30/// struct for typed errors of method [`add_cluster_to_project`]
31#[derive(Debug, Clone, Serialize, Deserialize)]
32#[serde(untagged)]
33pub enum AddClusterToProjectError {
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 [`add_database_to_project`]
44#[derive(Debug, Clone, Serialize, Deserialize)]
45#[serde(untagged)]
46pub enum AddDatabaseToProjectError {
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 [`add_dedicated_server_to_project`]
57#[derive(Debug, Clone, Serialize, Deserialize)]
58#[serde(untagged)]
59pub enum AddDedicatedServerToProjectError {
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 [`add_server_to_project`]
70#[derive(Debug, Clone, Serialize, Deserialize)]
71#[serde(untagged)]
72pub enum AddServerToProjectError {
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 [`add_storage_to_project`]
83#[derive(Debug, Clone, Serialize, Deserialize)]
84#[serde(untagged)]
85pub enum AddStorageToProjectError {
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 [`create_project`]
96#[derive(Debug, Clone, Serialize, Deserialize)]
97#[serde(untagged)]
98pub enum CreateProjectError {
99    Status400(models::GetFinances400Response),
100    Status401(models::GetFinances401Response),
101    Status403(models::GetAccountStatus403Response),
102    Status429(models::GetFinances429Response),
103    Status500(models::GetFinances500Response),
104    UnknownValue(serde_json::Value)
105}
106
107/// struct for typed errors of method [`delete_project`]
108#[derive(Debug, Clone, Serialize, Deserialize)]
109#[serde(untagged)]
110pub enum DeleteProjectError {
111    Status400(models::GetFinances400Response),
112    Status401(models::GetFinances401Response),
113    Status403(models::GetAccountStatus403Response),
114    Status404(models::GetImage404Response),
115    Status429(models::GetFinances429Response),
116    Status500(models::GetFinances500Response),
117    UnknownValue(serde_json::Value)
118}
119
120/// struct for typed errors of method [`get_account_balancers`]
121#[derive(Debug, Clone, Serialize, Deserialize)]
122#[serde(untagged)]
123pub enum GetAccountBalancersError {
124    Status400(models::GetFinances400Response),
125    Status401(models::GetFinances401Response),
126    Status429(models::GetFinances429Response),
127    Status500(models::GetFinances500Response),
128    UnknownValue(serde_json::Value)
129}
130
131/// struct for typed errors of method [`get_account_clusters`]
132#[derive(Debug, Clone, Serialize, Deserialize)]
133#[serde(untagged)]
134pub enum GetAccountClustersError {
135    Status400(models::GetFinances400Response),
136    Status401(models::GetFinances401Response),
137    Status429(models::GetFinances429Response),
138    Status500(models::GetFinances500Response),
139    UnknownValue(serde_json::Value)
140}
141
142/// struct for typed errors of method [`get_account_databases`]
143#[derive(Debug, Clone, Serialize, Deserialize)]
144#[serde(untagged)]
145pub enum GetAccountDatabasesError {
146    Status400(models::GetFinances400Response),
147    Status401(models::GetFinances401Response),
148    Status429(models::GetFinances429Response),
149    Status500(models::GetFinances500Response),
150    UnknownValue(serde_json::Value)
151}
152
153/// struct for typed errors of method [`get_account_dedicated_servers`]
154#[derive(Debug, Clone, Serialize, Deserialize)]
155#[serde(untagged)]
156pub enum GetAccountDedicatedServersError {
157    Status400(models::GetFinances400Response),
158    Status401(models::GetFinances401Response),
159    Status429(models::GetFinances429Response),
160    Status500(models::GetFinances500Response),
161    UnknownValue(serde_json::Value)
162}
163
164/// struct for typed errors of method [`get_account_servers`]
165#[derive(Debug, Clone, Serialize, Deserialize)]
166#[serde(untagged)]
167pub enum GetAccountServersError {
168    Status400(models::GetFinances400Response),
169    Status401(models::GetFinances401Response),
170    Status429(models::GetFinances429Response),
171    Status500(models::GetFinances500Response),
172    UnknownValue(serde_json::Value)
173}
174
175/// struct for typed errors of method [`get_account_storages`]
176#[derive(Debug, Clone, Serialize, Deserialize)]
177#[serde(untagged)]
178pub enum GetAccountStoragesError {
179    Status400(models::GetFinances400Response),
180    Status401(models::GetFinances401Response),
181    Status429(models::GetFinances429Response),
182    Status500(models::GetFinances500Response),
183    UnknownValue(serde_json::Value)
184}
185
186/// struct for typed errors of method [`get_all_project_resources`]
187#[derive(Debug, Clone, Serialize, Deserialize)]
188#[serde(untagged)]
189pub enum GetAllProjectResourcesError {
190    Status400(models::GetFinances400Response),
191    Status401(models::GetFinances401Response),
192    Status403(models::GetAccountStatus403Response),
193    Status404(models::GetImage404Response),
194    Status429(models::GetFinances429Response),
195    Status500(models::GetFinances500Response),
196    UnknownValue(serde_json::Value)
197}
198
199/// struct for typed errors of method [`get_project`]
200#[derive(Debug, Clone, Serialize, Deserialize)]
201#[serde(untagged)]
202pub enum GetProjectError {
203    Status400(models::GetFinances400Response),
204    Status401(models::GetFinances401Response),
205    Status403(models::GetAccountStatus403Response),
206    Status404(models::GetImage404Response),
207    Status429(models::GetFinances429Response),
208    Status500(models::GetFinances500Response),
209    UnknownValue(serde_json::Value)
210}
211
212/// struct for typed errors of method [`get_project_balancers`]
213#[derive(Debug, Clone, Serialize, Deserialize)]
214#[serde(untagged)]
215pub enum GetProjectBalancersError {
216    Status400(models::GetFinances400Response),
217    Status401(models::GetFinances401Response),
218    Status403(models::GetAccountStatus403Response),
219    Status404(models::GetImage404Response),
220    Status429(models::GetFinances429Response),
221    Status500(models::GetFinances500Response),
222    UnknownValue(serde_json::Value)
223}
224
225/// struct for typed errors of method [`get_project_clusters`]
226#[derive(Debug, Clone, Serialize, Deserialize)]
227#[serde(untagged)]
228pub enum GetProjectClustersError {
229    Status400(models::GetFinances400Response),
230    Status401(models::GetFinances401Response),
231    Status403(models::GetAccountStatus403Response),
232    Status404(models::GetImage404Response),
233    Status429(models::GetFinances429Response),
234    Status500(models::GetFinances500Response),
235    UnknownValue(serde_json::Value)
236}
237
238/// struct for typed errors of method [`get_project_databases`]
239#[derive(Debug, Clone, Serialize, Deserialize)]
240#[serde(untagged)]
241pub enum GetProjectDatabasesError {
242    Status400(models::GetFinances400Response),
243    Status401(models::GetFinances401Response),
244    Status403(models::GetAccountStatus403Response),
245    Status404(models::GetImage404Response),
246    Status429(models::GetFinances429Response),
247    Status500(models::GetFinances500Response),
248    UnknownValue(serde_json::Value)
249}
250
251/// struct for typed errors of method [`get_project_dedicated_servers`]
252#[derive(Debug, Clone, Serialize, Deserialize)]
253#[serde(untagged)]
254pub enum GetProjectDedicatedServersError {
255    Status400(models::GetFinances400Response),
256    Status401(models::GetFinances401Response),
257    Status403(models::GetAccountStatus403Response),
258    Status404(models::GetImage404Response),
259    Status429(models::GetFinances429Response),
260    Status500(models::GetFinances500Response),
261    UnknownValue(serde_json::Value)
262}
263
264/// struct for typed errors of method [`get_project_servers`]
265#[derive(Debug, Clone, Serialize, Deserialize)]
266#[serde(untagged)]
267pub enum GetProjectServersError {
268    Status400(models::GetFinances400Response),
269    Status401(models::GetFinances401Response),
270    Status403(models::GetAccountStatus403Response),
271    Status404(models::GetImage404Response),
272    Status429(models::GetFinances429Response),
273    Status500(models::GetFinances500Response),
274    UnknownValue(serde_json::Value)
275}
276
277/// struct for typed errors of method [`get_project_storages`]
278#[derive(Debug, Clone, Serialize, Deserialize)]
279#[serde(untagged)]
280pub enum GetProjectStoragesError {
281    Status400(models::GetFinances400Response),
282    Status401(models::GetFinances401Response),
283    Status403(models::GetAccountStatus403Response),
284    Status404(models::GetImage404Response),
285    Status429(models::GetFinances429Response),
286    Status500(models::GetFinances500Response),
287    UnknownValue(serde_json::Value)
288}
289
290/// struct for typed errors of method [`get_projects`]
291#[derive(Debug, Clone, Serialize, Deserialize)]
292#[serde(untagged)]
293pub enum GetProjectsError {
294    Status400(models::GetFinances400Response),
295    Status401(models::GetFinances401Response),
296    Status429(models::GetFinances429Response),
297    Status500(models::GetFinances500Response),
298    UnknownValue(serde_json::Value)
299}
300
301/// struct for typed errors of method [`transfer_resource_to_another_project`]
302#[derive(Debug, Clone, Serialize, Deserialize)]
303#[serde(untagged)]
304pub enum TransferResourceToAnotherProjectError {
305    Status400(models::GetFinances400Response),
306    Status401(models::GetFinances401Response),
307    Status403(models::GetAccountStatus403Response),
308    Status404(models::GetImage404Response),
309    Status429(models::GetFinances429Response),
310    Status500(models::GetFinances500Response),
311    UnknownValue(serde_json::Value)
312}
313
314/// struct for typed errors of method [`update_project`]
315#[derive(Debug, Clone, Serialize, Deserialize)]
316#[serde(untagged)]
317pub enum UpdateProjectError {
318    Status400(models::GetFinances400Response),
319    Status401(models::GetFinances401Response),
320    Status403(models::GetAccountStatus403Response),
321    Status404(models::GetImage404Response),
322    Status429(models::GetFinances429Response),
323    Status500(models::GetFinances500Response),
324    UnknownValue(serde_json::Value)
325}
326
327/// Чтобы добавить балансировщик в проект, отправьте POST-запрос на
328/// `/api/v1/projects/{project_id}/resources/balancers`, задав необходимые
329/// атрибуты.  Балансировщик будет добавлен в указанный проект. Тело ответа
330/// будет содержать объект JSON с информацией о добавленном балансировщике.
331pub async fn add_balancer_to_project(
332    configuration: &configuration::Configuration,
333    project_id: i32,
334    add_balancer_to_project_request: models::AddBalancerToProjectRequest
335) -> Result<models::AddBalancerToProject200Response, Error<AddBalancerToProjectError>> {
336    // add a prefix to parameters to efficiently prevent name collisions
337    let p_path_project_id = project_id;
338    let p_body_add_balancer_to_project_request = add_balancer_to_project_request;
339
340    let uri_str = format!(
341        "{}/api/v1/projects/{project_id}/resources/balancers",
342        configuration.base_path,
343        project_id = p_path_project_id
344    );
345    let mut req_builder = configuration
346        .client
347        .request(reqwest::Method::POST, &uri_str);
348
349    if let Some(ref user_agent) = configuration.user_agent {
350        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
351    }
352    if let Some(ref token) = configuration.bearer_access_token {
353        req_builder = req_builder.bearer_auth(token.to_owned());
354    };
355    req_builder = req_builder.json(&p_body_add_balancer_to_project_request);
356
357    let req = req_builder.build()?;
358    let resp = configuration.client.execute(req).await?;
359
360    let status = resp.status();
361    let content_type = resp
362        .headers()
363        .get("content-type")
364        .and_then(|v| v.to_str().ok())
365        .unwrap_or("application/octet-stream");
366    let content_type = super::ContentType::from(content_type);
367
368    if !status.is_client_error() && !status.is_server_error() {
369        let content = resp.text().await?;
370        match content_type {
371            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
372            ContentType::Text => {
373                return Err(Error::from(serde_json::Error::custom(
374                    "Received `text/plain` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
375                )));
376            }
377            ContentType::Unsupported(unknown_type) => {
378                return Err(Error::from(serde_json::Error::custom(format!(
379                    "Received `{unknown_type}` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
380                ))));
381            }
382        }
383    } else {
384        let content = resp.text().await?;
385        let entity: Option<AddBalancerToProjectError> = serde_json::from_str(&content).ok();
386        Err(Error::ResponseError(ResponseContent {
387            status,
388            content,
389            entity
390        }))
391    }
392}
393
394/// Чтобы добавить кластер в проект, отправьте POST-запрос на
395/// `/api/v1/projects/{project_id}/resources/clusters`, задав необходимые
396/// атрибуты.  Кластер будет добавлен в указанный проект. Тело ответа будет
397/// содержать объект JSON с информацией о добавленном кластере.
398pub async fn add_cluster_to_project(
399    configuration: &configuration::Configuration,
400    project_id: i32,
401    add_cluster_to_project_request: models::AddClusterToProjectRequest
402) -> Result<models::AddBalancerToProject200Response, Error<AddClusterToProjectError>> {
403    // add a prefix to parameters to efficiently prevent name collisions
404    let p_path_project_id = project_id;
405    let p_body_add_cluster_to_project_request = add_cluster_to_project_request;
406
407    let uri_str = format!(
408        "{}/api/v1/projects/{project_id}/resources/clusters",
409        configuration.base_path,
410        project_id = p_path_project_id
411    );
412    let mut req_builder = configuration
413        .client
414        .request(reqwest::Method::POST, &uri_str);
415
416    if let Some(ref user_agent) = configuration.user_agent {
417        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
418    }
419    if let Some(ref token) = configuration.bearer_access_token {
420        req_builder = req_builder.bearer_auth(token.to_owned());
421    };
422    req_builder = req_builder.json(&p_body_add_cluster_to_project_request);
423
424    let req = req_builder.build()?;
425    let resp = configuration.client.execute(req).await?;
426
427    let status = resp.status();
428    let content_type = resp
429        .headers()
430        .get("content-type")
431        .and_then(|v| v.to_str().ok())
432        .unwrap_or("application/octet-stream");
433    let content_type = super::ContentType::from(content_type);
434
435    if !status.is_client_error() && !status.is_server_error() {
436        let content = resp.text().await?;
437        match content_type {
438            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
439            ContentType::Text => {
440                return Err(Error::from(serde_json::Error::custom(
441                    "Received `text/plain` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
442                )));
443            }
444            ContentType::Unsupported(unknown_type) => {
445                return Err(Error::from(serde_json::Error::custom(format!(
446                    "Received `{unknown_type}` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
447                ))));
448            }
449        }
450    } else {
451        let content = resp.text().await?;
452        let entity: Option<AddClusterToProjectError> = serde_json::from_str(&content).ok();
453        Err(Error::ResponseError(ResponseContent {
454            status,
455            content,
456            entity
457        }))
458    }
459}
460
461/// Чтобы добавить базу данных в проект, отправьте POST-запрос на
462/// `/api/v1/projects/{project_id}/resources/databases`, задав необходимые
463/// атрибуты.  База данных будет добавлена в указанный проект. Тело ответа будет
464/// содержать объект JSON с информацией о добавленной базе данных.
465pub async fn add_database_to_project(
466    configuration: &configuration::Configuration,
467    project_id: i32,
468    add_database_to_project_request: models::AddDatabaseToProjectRequest
469) -> Result<models::AddBalancerToProject200Response, Error<AddDatabaseToProjectError>> {
470    // add a prefix to parameters to efficiently prevent name collisions
471    let p_path_project_id = project_id;
472    let p_body_add_database_to_project_request = add_database_to_project_request;
473
474    let uri_str = format!(
475        "{}/api/v1/projects/{project_id}/resources/databases",
476        configuration.base_path,
477        project_id = p_path_project_id
478    );
479    let mut req_builder = configuration
480        .client
481        .request(reqwest::Method::POST, &uri_str);
482
483    if let Some(ref user_agent) = configuration.user_agent {
484        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
485    }
486    if let Some(ref token) = configuration.bearer_access_token {
487        req_builder = req_builder.bearer_auth(token.to_owned());
488    };
489    req_builder = req_builder.json(&p_body_add_database_to_project_request);
490
491    let req = req_builder.build()?;
492    let resp = configuration.client.execute(req).await?;
493
494    let status = resp.status();
495    let content_type = resp
496        .headers()
497        .get("content-type")
498        .and_then(|v| v.to_str().ok())
499        .unwrap_or("application/octet-stream");
500    let content_type = super::ContentType::from(content_type);
501
502    if !status.is_client_error() && !status.is_server_error() {
503        let content = resp.text().await?;
504        match content_type {
505            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
506            ContentType::Text => {
507                return Err(Error::from(serde_json::Error::custom(
508                    "Received `text/plain` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
509                )));
510            }
511            ContentType::Unsupported(unknown_type) => {
512                return Err(Error::from(serde_json::Error::custom(format!(
513                    "Received `{unknown_type}` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
514                ))));
515            }
516        }
517    } else {
518        let content = resp.text().await?;
519        let entity: Option<AddDatabaseToProjectError> = serde_json::from_str(&content).ok();
520        Err(Error::ResponseError(ResponseContent {
521            status,
522            content,
523            entity
524        }))
525    }
526}
527
528/// Чтобы добавить выделенный сервер в проект, отправьте POST-запрос на
529/// `/api/v1/projects/{project_id}/resources/dedicated`, задав необходимые
530/// атрибуты.  Выделенный сервер будет добавлен в указанный проект. Тело ответа
531/// будет содержать объект JSON с информацией о добавленном выделенном сервере.
532pub async fn add_dedicated_server_to_project(
533    configuration: &configuration::Configuration,
534    project_id: i32,
535    add_dedicated_server_to_project_request: models::AddDedicatedServerToProjectRequest
536) -> Result<models::AddBalancerToProject200Response, Error<AddDedicatedServerToProjectError>> {
537    // add a prefix to parameters to efficiently prevent name collisions
538    let p_path_project_id = project_id;
539    let p_body_add_dedicated_server_to_project_request = add_dedicated_server_to_project_request;
540
541    let uri_str = format!(
542        "{}/api/v1/projects/{project_id}/resources/dedicated",
543        configuration.base_path,
544        project_id = p_path_project_id
545    );
546    let mut req_builder = configuration
547        .client
548        .request(reqwest::Method::POST, &uri_str);
549
550    if let Some(ref user_agent) = configuration.user_agent {
551        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
552    }
553    if let Some(ref token) = configuration.bearer_access_token {
554        req_builder = req_builder.bearer_auth(token.to_owned());
555    };
556    req_builder = req_builder.json(&p_body_add_dedicated_server_to_project_request);
557
558    let req = req_builder.build()?;
559    let resp = configuration.client.execute(req).await?;
560
561    let status = resp.status();
562    let content_type = resp
563        .headers()
564        .get("content-type")
565        .and_then(|v| v.to_str().ok())
566        .unwrap_or("application/octet-stream");
567    let content_type = super::ContentType::from(content_type);
568
569    if !status.is_client_error() && !status.is_server_error() {
570        let content = resp.text().await?;
571        match content_type {
572            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
573            ContentType::Text => {
574                return Err(Error::from(serde_json::Error::custom(
575                    "Received `text/plain` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
576                )));
577            }
578            ContentType::Unsupported(unknown_type) => {
579                return Err(Error::from(serde_json::Error::custom(format!(
580                    "Received `{unknown_type}` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
581                ))));
582            }
583        }
584    } else {
585        let content = resp.text().await?;
586        let entity: Option<AddDedicatedServerToProjectError> = serde_json::from_str(&content).ok();
587        Err(Error::ResponseError(ResponseContent {
588            status,
589            content,
590            entity
591        }))
592    }
593}
594
595/// Чтобы добавить сервер в проект, отправьте POST-запрос на
596/// `/api/v1/projects/{project_id}/resources/servers`, задав необходимые
597/// атрибуты.  Сервер будет добавлен в указанный проект. Тело ответа будет
598/// содержать объект JSON с информацией о добавленном сервере.
599pub async fn add_server_to_project(
600    configuration: &configuration::Configuration,
601    project_id: i32,
602    add_server_to_project_request: models::AddServerToProjectRequest
603) -> Result<models::AddBalancerToProject200Response, Error<AddServerToProjectError>> {
604    // add a prefix to parameters to efficiently prevent name collisions
605    let p_path_project_id = project_id;
606    let p_body_add_server_to_project_request = add_server_to_project_request;
607
608    let uri_str = format!(
609        "{}/api/v1/projects/{project_id}/resources/servers",
610        configuration.base_path,
611        project_id = p_path_project_id
612    );
613    let mut req_builder = configuration
614        .client
615        .request(reqwest::Method::POST, &uri_str);
616
617    if let Some(ref user_agent) = configuration.user_agent {
618        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
619    }
620    if let Some(ref token) = configuration.bearer_access_token {
621        req_builder = req_builder.bearer_auth(token.to_owned());
622    };
623    req_builder = req_builder.json(&p_body_add_server_to_project_request);
624
625    let req = req_builder.build()?;
626    let resp = configuration.client.execute(req).await?;
627
628    let status = resp.status();
629    let content_type = resp
630        .headers()
631        .get("content-type")
632        .and_then(|v| v.to_str().ok())
633        .unwrap_or("application/octet-stream");
634    let content_type = super::ContentType::from(content_type);
635
636    if !status.is_client_error() && !status.is_server_error() {
637        let content = resp.text().await?;
638        match content_type {
639            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
640            ContentType::Text => {
641                return Err(Error::from(serde_json::Error::custom(
642                    "Received `text/plain` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
643                )));
644            }
645            ContentType::Unsupported(unknown_type) => {
646                return Err(Error::from(serde_json::Error::custom(format!(
647                    "Received `{unknown_type}` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
648                ))));
649            }
650        }
651    } else {
652        let content = resp.text().await?;
653        let entity: Option<AddServerToProjectError> = serde_json::from_str(&content).ok();
654        Err(Error::ResponseError(ResponseContent {
655            status,
656            content,
657            entity
658        }))
659    }
660}
661
662/// Чтобы добавить хранилище в проект, отправьте POST-запрос на
663/// `/api/v1/projects/{project_id}/resources/buckets`, задав необходимые
664/// атрибуты.  Хранилище будет добавлено в указанный проект. Тело ответа будет
665/// содержать объект JSON с информацией о добавленном хранилище.
666pub async fn add_storage_to_project(
667    configuration: &configuration::Configuration,
668    project_id: i32,
669    add_storage_to_project_request: models::AddStorageToProjectRequest
670) -> Result<models::AddBalancerToProject200Response, Error<AddStorageToProjectError>> {
671    // add a prefix to parameters to efficiently prevent name collisions
672    let p_path_project_id = project_id;
673    let p_body_add_storage_to_project_request = add_storage_to_project_request;
674
675    let uri_str = format!(
676        "{}/api/v1/projects/{project_id}/resources/buckets",
677        configuration.base_path,
678        project_id = p_path_project_id
679    );
680    let mut req_builder = configuration
681        .client
682        .request(reqwest::Method::POST, &uri_str);
683
684    if let Some(ref user_agent) = configuration.user_agent {
685        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
686    }
687    if let Some(ref token) = configuration.bearer_access_token {
688        req_builder = req_builder.bearer_auth(token.to_owned());
689    };
690    req_builder = req_builder.json(&p_body_add_storage_to_project_request);
691
692    let req = req_builder.build()?;
693    let resp = configuration.client.execute(req).await?;
694
695    let status = resp.status();
696    let content_type = resp
697        .headers()
698        .get("content-type")
699        .and_then(|v| v.to_str().ok())
700        .unwrap_or("application/octet-stream");
701    let content_type = super::ContentType::from(content_type);
702
703    if !status.is_client_error() && !status.is_server_error() {
704        let content = resp.text().await?;
705        match content_type {
706            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
707            ContentType::Text => {
708                return Err(Error::from(serde_json::Error::custom(
709                    "Received `text/plain` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
710                )));
711            }
712            ContentType::Unsupported(unknown_type) => {
713                return Err(Error::from(serde_json::Error::custom(format!(
714                    "Received `{unknown_type}` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
715                ))));
716            }
717        }
718    } else {
719        let content = resp.text().await?;
720        let entity: Option<AddStorageToProjectError> = serde_json::from_str(&content).ok();
721        Err(Error::ResponseError(ResponseContent {
722            status,
723            content,
724            entity
725        }))
726    }
727}
728
729/// Чтобы создать проект, отправьте POST-запрос в `api/v1/projects`, задав
730/// необходимые атрибуты.  Проект будет создан с использованием предоставленной
731/// информации. Тело ответа будет содержать объект JSON с информацией о
732/// созданном проекте.
733pub async fn create_project(
734    configuration: &configuration::Configuration,
735    create_project: models::CreateProject
736) -> Result<models::CreateProject201Response, Error<CreateProjectError>> {
737    // add a prefix to parameters to efficiently prevent name collisions
738    let p_body_create_project = create_project;
739
740    let uri_str = format!("{}/api/v1/projects", configuration.base_path);
741    let mut req_builder = configuration
742        .client
743        .request(reqwest::Method::POST, &uri_str);
744
745    if let Some(ref user_agent) = configuration.user_agent {
746        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
747    }
748    if let Some(ref token) = configuration.bearer_access_token {
749        req_builder = req_builder.bearer_auth(token.to_owned());
750    };
751    req_builder = req_builder.json(&p_body_create_project);
752
753    let req = req_builder.build()?;
754    let resp = configuration.client.execute(req).await?;
755
756    let status = resp.status();
757    let content_type = resp
758        .headers()
759        .get("content-type")
760        .and_then(|v| v.to_str().ok())
761        .unwrap_or("application/octet-stream");
762    let content_type = super::ContentType::from(content_type);
763
764    if !status.is_client_error() && !status.is_server_error() {
765        let content = resp.text().await?;
766        match content_type {
767            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
768            ContentType::Text => {
769                return Err(Error::from(serde_json::Error::custom(
770                    "Received `text/plain` content type response that cannot be converted to `models::CreateProject201Response`"
771                )));
772            }
773            ContentType::Unsupported(unknown_type) => {
774                return Err(Error::from(serde_json::Error::custom(format!(
775                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateProject201Response`"
776                ))));
777            }
778        }
779    } else {
780        let content = resp.text().await?;
781        let entity: Option<CreateProjectError> = serde_json::from_str(&content).ok();
782        Err(Error::ResponseError(ResponseContent {
783            status,
784            content,
785            entity
786        }))
787    }
788}
789
790/// Чтобы удалить проект, отправьте запрос DELETE в
791/// `api/v1/projects/{project_id}`.
792pub async fn delete_project(
793    configuration: &configuration::Configuration,
794    project_id: i32
795) -> Result<(), Error<DeleteProjectError>> {
796    // add a prefix to parameters to efficiently prevent name collisions
797    let p_path_project_id = project_id;
798
799    let uri_str = format!(
800        "{}/api/v1/projects/{project_id}",
801        configuration.base_path,
802        project_id = p_path_project_id
803    );
804    let mut req_builder = configuration
805        .client
806        .request(reqwest::Method::DELETE, &uri_str);
807
808    if let Some(ref user_agent) = configuration.user_agent {
809        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
810    }
811    if let Some(ref token) = configuration.bearer_access_token {
812        req_builder = req_builder.bearer_auth(token.to_owned());
813    };
814
815    let req = req_builder.build()?;
816    let resp = configuration.client.execute(req).await?;
817
818    let status = resp.status();
819
820    if !status.is_client_error() && !status.is_server_error() {
821        Ok(())
822    } else {
823        let content = resp.text().await?;
824        let entity: Option<DeleteProjectError> = serde_json::from_str(&content).ok();
825        Err(Error::ResponseError(ResponseContent {
826            status,
827            content,
828            entity
829        }))
830    }
831}
832
833/// Чтобы получить список всех балансировщиков на аккаунте, отправьте GET-запрос
834/// на `/api/v1/projects/resources/balancers`.
835pub async fn get_account_balancers(
836    configuration: &configuration::Configuration
837) -> Result<models::GetProjectBalancers200Response, Error<GetAccountBalancersError>> {
838    let uri_str = format!(
839        "{}/api/v1/projects/resources/balancers",
840        configuration.base_path
841    );
842    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
843
844    if let Some(ref user_agent) = configuration.user_agent {
845        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
846    }
847    if let Some(ref token) = configuration.bearer_access_token {
848        req_builder = req_builder.bearer_auth(token.to_owned());
849    };
850
851    let req = req_builder.build()?;
852    let resp = configuration.client.execute(req).await?;
853
854    let status = resp.status();
855    let content_type = resp
856        .headers()
857        .get("content-type")
858        .and_then(|v| v.to_str().ok())
859        .unwrap_or("application/octet-stream");
860    let content_type = super::ContentType::from(content_type);
861
862    if !status.is_client_error() && !status.is_server_error() {
863        let content = resp.text().await?;
864        match content_type {
865            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
866            ContentType::Text => {
867                return Err(Error::from(serde_json::Error::custom(
868                    "Received `text/plain` content type response that cannot be converted to `models::GetProjectBalancers200Response`"
869                )));
870            }
871            ContentType::Unsupported(unknown_type) => {
872                return Err(Error::from(serde_json::Error::custom(format!(
873                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetProjectBalancers200Response`"
874                ))));
875            }
876        }
877    } else {
878        let content = resp.text().await?;
879        let entity: Option<GetAccountBalancersError> = serde_json::from_str(&content).ok();
880        Err(Error::ResponseError(ResponseContent {
881            status,
882            content,
883            entity
884        }))
885    }
886}
887
888/// Чтобы получить список всех кластеров на аккаунте, отправьте GET-запрос на
889/// `/api/v1/projects/resources/clusters`.
890pub async fn get_account_clusters(
891    configuration: &configuration::Configuration
892) -> Result<models::GetProjectClusters200Response, Error<GetAccountClustersError>> {
893    let uri_str = format!(
894        "{}/api/v1/projects/resources/clusters",
895        configuration.base_path
896    );
897    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
898
899    if let Some(ref user_agent) = configuration.user_agent {
900        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
901    }
902    if let Some(ref token) = configuration.bearer_access_token {
903        req_builder = req_builder.bearer_auth(token.to_owned());
904    };
905
906    let req = req_builder.build()?;
907    let resp = configuration.client.execute(req).await?;
908
909    let status = resp.status();
910    let content_type = resp
911        .headers()
912        .get("content-type")
913        .and_then(|v| v.to_str().ok())
914        .unwrap_or("application/octet-stream");
915    let content_type = super::ContentType::from(content_type);
916
917    if !status.is_client_error() && !status.is_server_error() {
918        let content = resp.text().await?;
919        match content_type {
920            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
921            ContentType::Text => {
922                return Err(Error::from(serde_json::Error::custom(
923                    "Received `text/plain` content type response that cannot be converted to `models::GetProjectClusters200Response`"
924                )));
925            }
926            ContentType::Unsupported(unknown_type) => {
927                return Err(Error::from(serde_json::Error::custom(format!(
928                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetProjectClusters200Response`"
929                ))));
930            }
931        }
932    } else {
933        let content = resp.text().await?;
934        let entity: Option<GetAccountClustersError> = serde_json::from_str(&content).ok();
935        Err(Error::ResponseError(ResponseContent {
936            status,
937            content,
938            entity
939        }))
940    }
941}
942
943/// Чтобы получить список всех баз данных на аккаунте, отправьте GET-запрос на
944/// `/api/v1/projects/resources/databases`.
945pub async fn get_account_databases(
946    configuration: &configuration::Configuration
947) -> Result<models::GetProjectDatabases200Response, Error<GetAccountDatabasesError>> {
948    let uri_str = format!(
949        "{}/api/v1/projects/resources/databases",
950        configuration.base_path
951    );
952    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
953
954    if let Some(ref user_agent) = configuration.user_agent {
955        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
956    }
957    if let Some(ref token) = configuration.bearer_access_token {
958        req_builder = req_builder.bearer_auth(token.to_owned());
959    };
960
961    let req = req_builder.build()?;
962    let resp = configuration.client.execute(req).await?;
963
964    let status = resp.status();
965    let content_type = resp
966        .headers()
967        .get("content-type")
968        .and_then(|v| v.to_str().ok())
969        .unwrap_or("application/octet-stream");
970    let content_type = super::ContentType::from(content_type);
971
972    if !status.is_client_error() && !status.is_server_error() {
973        let content = resp.text().await?;
974        match content_type {
975            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
976            ContentType::Text => {
977                return Err(Error::from(serde_json::Error::custom(
978                    "Received `text/plain` content type response that cannot be converted to `models::GetProjectDatabases200Response`"
979                )));
980            }
981            ContentType::Unsupported(unknown_type) => {
982                return Err(Error::from(serde_json::Error::custom(format!(
983                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetProjectDatabases200Response`"
984                ))));
985            }
986        }
987    } else {
988        let content = resp.text().await?;
989        let entity: Option<GetAccountDatabasesError> = serde_json::from_str(&content).ok();
990        Err(Error::ResponseError(ResponseContent {
991            status,
992            content,
993            entity
994        }))
995    }
996}
997
998/// Чтобы получить список всех выделенных серверов на аккаунте, отправьте
999/// GET-запрос на `/api/v1/projects/resources/dedicated`.
1000pub async fn get_account_dedicated_servers(
1001    configuration: &configuration::Configuration
1002) -> Result<models::GetProjectDedicatedServers200Response, Error<GetAccountDedicatedServersError>>
1003{
1004    let uri_str = format!(
1005        "{}/api/v1/projects/resources/dedicated",
1006        configuration.base_path
1007    );
1008    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
1009
1010    if let Some(ref user_agent) = configuration.user_agent {
1011        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1012    }
1013    if let Some(ref token) = configuration.bearer_access_token {
1014        req_builder = req_builder.bearer_auth(token.to_owned());
1015    };
1016
1017    let req = req_builder.build()?;
1018    let resp = configuration.client.execute(req).await?;
1019
1020    let status = resp.status();
1021    let content_type = resp
1022        .headers()
1023        .get("content-type")
1024        .and_then(|v| v.to_str().ok())
1025        .unwrap_or("application/octet-stream");
1026    let content_type = super::ContentType::from(content_type);
1027
1028    if !status.is_client_error() && !status.is_server_error() {
1029        let content = resp.text().await?;
1030        match content_type {
1031            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1032            ContentType::Text => {
1033                return Err(Error::from(serde_json::Error::custom(
1034                    "Received `text/plain` content type response that cannot be converted to `models::GetProjectDedicatedServers200Response`"
1035                )));
1036            }
1037            ContentType::Unsupported(unknown_type) => {
1038                return Err(Error::from(serde_json::Error::custom(format!(
1039                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetProjectDedicatedServers200Response`"
1040                ))));
1041            }
1042        }
1043    } else {
1044        let content = resp.text().await?;
1045        let entity: Option<GetAccountDedicatedServersError> = serde_json::from_str(&content).ok();
1046        Err(Error::ResponseError(ResponseContent {
1047            status,
1048            content,
1049            entity
1050        }))
1051    }
1052}
1053
1054/// Чтобы получить список всех серверов на аккаунте, отправьте GET-запрос на
1055/// `/api/v1/projects/resources/servers`.
1056pub async fn get_account_servers(
1057    configuration: &configuration::Configuration
1058) -> Result<models::GetProjectServers200Response, Error<GetAccountServersError>> {
1059    let uri_str = format!(
1060        "{}/api/v1/projects/resources/servers",
1061        configuration.base_path
1062    );
1063    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
1064
1065    if let Some(ref user_agent) = configuration.user_agent {
1066        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1067    }
1068    if let Some(ref token) = configuration.bearer_access_token {
1069        req_builder = req_builder.bearer_auth(token.to_owned());
1070    };
1071
1072    let req = req_builder.build()?;
1073    let resp = configuration.client.execute(req).await?;
1074
1075    let status = resp.status();
1076    let content_type = resp
1077        .headers()
1078        .get("content-type")
1079        .and_then(|v| v.to_str().ok())
1080        .unwrap_or("application/octet-stream");
1081    let content_type = super::ContentType::from(content_type);
1082
1083    if !status.is_client_error() && !status.is_server_error() {
1084        let content = resp.text().await?;
1085        match content_type {
1086            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1087            ContentType::Text => {
1088                return Err(Error::from(serde_json::Error::custom(
1089                    "Received `text/plain` content type response that cannot be converted to `models::GetProjectServers200Response`"
1090                )));
1091            }
1092            ContentType::Unsupported(unknown_type) => {
1093                return Err(Error::from(serde_json::Error::custom(format!(
1094                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetProjectServers200Response`"
1095                ))));
1096            }
1097        }
1098    } else {
1099        let content = resp.text().await?;
1100        let entity: Option<GetAccountServersError> = serde_json::from_str(&content).ok();
1101        Err(Error::ResponseError(ResponseContent {
1102            status,
1103            content,
1104            entity
1105        }))
1106    }
1107}
1108
1109/// Чтобы получить список всех хранилищ на аккаунте, отправьте GET-запрос на
1110/// `/api/v1/projects/resources/buckets`.
1111pub async fn get_account_storages(
1112    configuration: &configuration::Configuration
1113) -> Result<models::GetProjectStorages200Response, Error<GetAccountStoragesError>> {
1114    let uri_str = format!(
1115        "{}/api/v1/projects/resources/buckets",
1116        configuration.base_path
1117    );
1118    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
1119
1120    if let Some(ref user_agent) = configuration.user_agent {
1121        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1122    }
1123    if let Some(ref token) = configuration.bearer_access_token {
1124        req_builder = req_builder.bearer_auth(token.to_owned());
1125    };
1126
1127    let req = req_builder.build()?;
1128    let resp = configuration.client.execute(req).await?;
1129
1130    let status = resp.status();
1131    let content_type = resp
1132        .headers()
1133        .get("content-type")
1134        .and_then(|v| v.to_str().ok())
1135        .unwrap_or("application/octet-stream");
1136    let content_type = super::ContentType::from(content_type);
1137
1138    if !status.is_client_error() && !status.is_server_error() {
1139        let content = resp.text().await?;
1140        match content_type {
1141            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1142            ContentType::Text => {
1143                return Err(Error::from(serde_json::Error::custom(
1144                    "Received `text/plain` content type response that cannot be converted to `models::GetProjectStorages200Response`"
1145                )));
1146            }
1147            ContentType::Unsupported(unknown_type) => {
1148                return Err(Error::from(serde_json::Error::custom(format!(
1149                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetProjectStorages200Response`"
1150                ))));
1151            }
1152        }
1153    } else {
1154        let content = resp.text().await?;
1155        let entity: Option<GetAccountStoragesError> = serde_json::from_str(&content).ok();
1156        Err(Error::ResponseError(ResponseContent {
1157            status,
1158            content,
1159            entity
1160        }))
1161    }
1162}
1163
1164/// Чтобы получить все ресурсы проекта, отправьте GET-запрос на
1165/// `/api/v1/projects/{project_id}/resources`.
1166pub async fn get_all_project_resources(
1167    configuration: &configuration::Configuration,
1168    project_id: i32
1169) -> Result<models::GetAllProjectResources200Response, Error<GetAllProjectResourcesError>> {
1170    // add a prefix to parameters to efficiently prevent name collisions
1171    let p_path_project_id = project_id;
1172
1173    let uri_str = format!(
1174        "{}/api/v1/projects/{project_id}/resources",
1175        configuration.base_path,
1176        project_id = p_path_project_id
1177    );
1178    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
1179
1180    if let Some(ref user_agent) = configuration.user_agent {
1181        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1182    }
1183    if let Some(ref token) = configuration.bearer_access_token {
1184        req_builder = req_builder.bearer_auth(token.to_owned());
1185    };
1186
1187    let req = req_builder.build()?;
1188    let resp = configuration.client.execute(req).await?;
1189
1190    let status = resp.status();
1191    let content_type = resp
1192        .headers()
1193        .get("content-type")
1194        .and_then(|v| v.to_str().ok())
1195        .unwrap_or("application/octet-stream");
1196    let content_type = super::ContentType::from(content_type);
1197
1198    if !status.is_client_error() && !status.is_server_error() {
1199        let content = resp.text().await?;
1200        match content_type {
1201            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1202            ContentType::Text => {
1203                return Err(Error::from(serde_json::Error::custom(
1204                    "Received `text/plain` content type response that cannot be converted to `models::GetAllProjectResources200Response`"
1205                )));
1206            }
1207            ContentType::Unsupported(unknown_type) => {
1208                return Err(Error::from(serde_json::Error::custom(format!(
1209                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetAllProjectResources200Response`"
1210                ))));
1211            }
1212        }
1213    } else {
1214        let content = resp.text().await?;
1215        let entity: Option<GetAllProjectResourcesError> = serde_json::from_str(&content).ok();
1216        Err(Error::ResponseError(ResponseContent {
1217            status,
1218            content,
1219            entity
1220        }))
1221    }
1222}
1223
1224/// Чтобы получить проект по ID, отправьте GET-запрос на
1225/// `/api/v1/projects/{project_id}`.
1226pub async fn get_project(
1227    configuration: &configuration::Configuration,
1228    project_id: i32
1229) -> Result<models::CreateProject201Response, Error<GetProjectError>> {
1230    // add a prefix to parameters to efficiently prevent name collisions
1231    let p_path_project_id = project_id;
1232
1233    let uri_str = format!(
1234        "{}/api/v1/projects/{project_id}",
1235        configuration.base_path,
1236        project_id = p_path_project_id
1237    );
1238    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
1239
1240    if let Some(ref user_agent) = configuration.user_agent {
1241        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1242    }
1243    if let Some(ref token) = configuration.bearer_access_token {
1244        req_builder = req_builder.bearer_auth(token.to_owned());
1245    };
1246
1247    let req = req_builder.build()?;
1248    let resp = configuration.client.execute(req).await?;
1249
1250    let status = resp.status();
1251    let content_type = resp
1252        .headers()
1253        .get("content-type")
1254        .and_then(|v| v.to_str().ok())
1255        .unwrap_or("application/octet-stream");
1256    let content_type = super::ContentType::from(content_type);
1257
1258    if !status.is_client_error() && !status.is_server_error() {
1259        let content = resp.text().await?;
1260        match content_type {
1261            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1262            ContentType::Text => {
1263                return Err(Error::from(serde_json::Error::custom(
1264                    "Received `text/plain` content type response that cannot be converted to `models::CreateProject201Response`"
1265                )));
1266            }
1267            ContentType::Unsupported(unknown_type) => {
1268                return Err(Error::from(serde_json::Error::custom(format!(
1269                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateProject201Response`"
1270                ))));
1271            }
1272        }
1273    } else {
1274        let content = resp.text().await?;
1275        let entity: Option<GetProjectError> = serde_json::from_str(&content).ok();
1276        Err(Error::ResponseError(ResponseContent {
1277            status,
1278            content,
1279            entity
1280        }))
1281    }
1282}
1283
1284/// Чтобы получить список балансировщиков проекта, отправьте GET-запрос на
1285/// `/api/v1/projects/{project_id}/resources/balancers`.
1286pub async fn get_project_balancers(
1287    configuration: &configuration::Configuration,
1288    project_id: i32
1289) -> Result<models::GetProjectBalancers200Response, Error<GetProjectBalancersError>> {
1290    // add a prefix to parameters to efficiently prevent name collisions
1291    let p_path_project_id = project_id;
1292
1293    let uri_str = format!(
1294        "{}/api/v1/projects/{project_id}/resources/balancers",
1295        configuration.base_path,
1296        project_id = p_path_project_id
1297    );
1298    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
1299
1300    if let Some(ref user_agent) = configuration.user_agent {
1301        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1302    }
1303    if let Some(ref token) = configuration.bearer_access_token {
1304        req_builder = req_builder.bearer_auth(token.to_owned());
1305    };
1306
1307    let req = req_builder.build()?;
1308    let resp = configuration.client.execute(req).await?;
1309
1310    let status = resp.status();
1311    let content_type = resp
1312        .headers()
1313        .get("content-type")
1314        .and_then(|v| v.to_str().ok())
1315        .unwrap_or("application/octet-stream");
1316    let content_type = super::ContentType::from(content_type);
1317
1318    if !status.is_client_error() && !status.is_server_error() {
1319        let content = resp.text().await?;
1320        match content_type {
1321            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1322            ContentType::Text => {
1323                return Err(Error::from(serde_json::Error::custom(
1324                    "Received `text/plain` content type response that cannot be converted to `models::GetProjectBalancers200Response`"
1325                )));
1326            }
1327            ContentType::Unsupported(unknown_type) => {
1328                return Err(Error::from(serde_json::Error::custom(format!(
1329                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetProjectBalancers200Response`"
1330                ))));
1331            }
1332        }
1333    } else {
1334        let content = resp.text().await?;
1335        let entity: Option<GetProjectBalancersError> = serde_json::from_str(&content).ok();
1336        Err(Error::ResponseError(ResponseContent {
1337            status,
1338            content,
1339            entity
1340        }))
1341    }
1342}
1343
1344/// Чтобы получить список кластеров проекта, отправьте GET-запрос на
1345/// `/api/v1/projects/{project_id}/resources/clusters`.
1346pub async fn get_project_clusters(
1347    configuration: &configuration::Configuration,
1348    project_id: i32
1349) -> Result<models::GetProjectClusters200Response, Error<GetProjectClustersError>> {
1350    // add a prefix to parameters to efficiently prevent name collisions
1351    let p_path_project_id = project_id;
1352
1353    let uri_str = format!(
1354        "{}/api/v1/projects/{project_id}/resources/clusters",
1355        configuration.base_path,
1356        project_id = p_path_project_id
1357    );
1358    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
1359
1360    if let Some(ref user_agent) = configuration.user_agent {
1361        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1362    }
1363    if let Some(ref token) = configuration.bearer_access_token {
1364        req_builder = req_builder.bearer_auth(token.to_owned());
1365    };
1366
1367    let req = req_builder.build()?;
1368    let resp = configuration.client.execute(req).await?;
1369
1370    let status = resp.status();
1371    let content_type = resp
1372        .headers()
1373        .get("content-type")
1374        .and_then(|v| v.to_str().ok())
1375        .unwrap_or("application/octet-stream");
1376    let content_type = super::ContentType::from(content_type);
1377
1378    if !status.is_client_error() && !status.is_server_error() {
1379        let content = resp.text().await?;
1380        match content_type {
1381            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1382            ContentType::Text => {
1383                return Err(Error::from(serde_json::Error::custom(
1384                    "Received `text/plain` content type response that cannot be converted to `models::GetProjectClusters200Response`"
1385                )));
1386            }
1387            ContentType::Unsupported(unknown_type) => {
1388                return Err(Error::from(serde_json::Error::custom(format!(
1389                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetProjectClusters200Response`"
1390                ))));
1391            }
1392        }
1393    } else {
1394        let content = resp.text().await?;
1395        let entity: Option<GetProjectClustersError> = serde_json::from_str(&content).ok();
1396        Err(Error::ResponseError(ResponseContent {
1397            status,
1398            content,
1399            entity
1400        }))
1401    }
1402}
1403
1404/// Чтобы получить список баз данных проекта, отправьте GET-запрос на
1405/// `/api/v1/projects/{project_id}/resources/databases`.
1406pub async fn get_project_databases(
1407    configuration: &configuration::Configuration,
1408    project_id: i32
1409) -> Result<models::GetProjectDatabases200Response, Error<GetProjectDatabasesError>> {
1410    // add a prefix to parameters to efficiently prevent name collisions
1411    let p_path_project_id = project_id;
1412
1413    let uri_str = format!(
1414        "{}/api/v1/projects/{project_id}/resources/databases",
1415        configuration.base_path,
1416        project_id = p_path_project_id
1417    );
1418    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
1419
1420    if let Some(ref user_agent) = configuration.user_agent {
1421        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1422    }
1423    if let Some(ref token) = configuration.bearer_access_token {
1424        req_builder = req_builder.bearer_auth(token.to_owned());
1425    };
1426
1427    let req = req_builder.build()?;
1428    let resp = configuration.client.execute(req).await?;
1429
1430    let status = resp.status();
1431    let content_type = resp
1432        .headers()
1433        .get("content-type")
1434        .and_then(|v| v.to_str().ok())
1435        .unwrap_or("application/octet-stream");
1436    let content_type = super::ContentType::from(content_type);
1437
1438    if !status.is_client_error() && !status.is_server_error() {
1439        let content = resp.text().await?;
1440        match content_type {
1441            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1442            ContentType::Text => {
1443                return Err(Error::from(serde_json::Error::custom(
1444                    "Received `text/plain` content type response that cannot be converted to `models::GetProjectDatabases200Response`"
1445                )));
1446            }
1447            ContentType::Unsupported(unknown_type) => {
1448                return Err(Error::from(serde_json::Error::custom(format!(
1449                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetProjectDatabases200Response`"
1450                ))));
1451            }
1452        }
1453    } else {
1454        let content = resp.text().await?;
1455        let entity: Option<GetProjectDatabasesError> = serde_json::from_str(&content).ok();
1456        Err(Error::ResponseError(ResponseContent {
1457            status,
1458            content,
1459            entity
1460        }))
1461    }
1462}
1463
1464/// Чтобы получить список выделенных серверов проекта, отправьте GET-запрос на
1465/// `/api/v1/projects/{project_id}/resources/dedicated`.
1466pub async fn get_project_dedicated_servers(
1467    configuration: &configuration::Configuration,
1468    project_id: i32
1469) -> Result<models::GetProjectDedicatedServers200Response, Error<GetProjectDedicatedServersError>>
1470{
1471    // add a prefix to parameters to efficiently prevent name collisions
1472    let p_path_project_id = project_id;
1473
1474    let uri_str = format!(
1475        "{}/api/v1/projects/{project_id}/resources/dedicated",
1476        configuration.base_path,
1477        project_id = p_path_project_id
1478    );
1479    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
1480
1481    if let Some(ref user_agent) = configuration.user_agent {
1482        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1483    }
1484    if let Some(ref token) = configuration.bearer_access_token {
1485        req_builder = req_builder.bearer_auth(token.to_owned());
1486    };
1487
1488    let req = req_builder.build()?;
1489    let resp = configuration.client.execute(req).await?;
1490
1491    let status = resp.status();
1492    let content_type = resp
1493        .headers()
1494        .get("content-type")
1495        .and_then(|v| v.to_str().ok())
1496        .unwrap_or("application/octet-stream");
1497    let content_type = super::ContentType::from(content_type);
1498
1499    if !status.is_client_error() && !status.is_server_error() {
1500        let content = resp.text().await?;
1501        match content_type {
1502            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1503            ContentType::Text => {
1504                return Err(Error::from(serde_json::Error::custom(
1505                    "Received `text/plain` content type response that cannot be converted to `models::GetProjectDedicatedServers200Response`"
1506                )));
1507            }
1508            ContentType::Unsupported(unknown_type) => {
1509                return Err(Error::from(serde_json::Error::custom(format!(
1510                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetProjectDedicatedServers200Response`"
1511                ))));
1512            }
1513        }
1514    } else {
1515        let content = resp.text().await?;
1516        let entity: Option<GetProjectDedicatedServersError> = serde_json::from_str(&content).ok();
1517        Err(Error::ResponseError(ResponseContent {
1518            status,
1519            content,
1520            entity
1521        }))
1522    }
1523}
1524
1525/// Чтобы получить список серверов проекта, отправьте GET-запрос на
1526/// `/api/v1/projects/{project_id}/resources/servers`.
1527pub async fn get_project_servers(
1528    configuration: &configuration::Configuration,
1529    project_id: i32
1530) -> Result<models::GetProjectServers200Response, Error<GetProjectServersError>> {
1531    // add a prefix to parameters to efficiently prevent name collisions
1532    let p_path_project_id = project_id;
1533
1534    let uri_str = format!(
1535        "{}/api/v1/projects/{project_id}/resources/servers",
1536        configuration.base_path,
1537        project_id = p_path_project_id
1538    );
1539    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
1540
1541    if let Some(ref user_agent) = configuration.user_agent {
1542        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1543    }
1544    if let Some(ref token) = configuration.bearer_access_token {
1545        req_builder = req_builder.bearer_auth(token.to_owned());
1546    };
1547
1548    let req = req_builder.build()?;
1549    let resp = configuration.client.execute(req).await?;
1550
1551    let status = resp.status();
1552    let content_type = resp
1553        .headers()
1554        .get("content-type")
1555        .and_then(|v| v.to_str().ok())
1556        .unwrap_or("application/octet-stream");
1557    let content_type = super::ContentType::from(content_type);
1558
1559    if !status.is_client_error() && !status.is_server_error() {
1560        let content = resp.text().await?;
1561        match content_type {
1562            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1563            ContentType::Text => {
1564                return Err(Error::from(serde_json::Error::custom(
1565                    "Received `text/plain` content type response that cannot be converted to `models::GetProjectServers200Response`"
1566                )));
1567            }
1568            ContentType::Unsupported(unknown_type) => {
1569                return Err(Error::from(serde_json::Error::custom(format!(
1570                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetProjectServers200Response`"
1571                ))));
1572            }
1573        }
1574    } else {
1575        let content = resp.text().await?;
1576        let entity: Option<GetProjectServersError> = serde_json::from_str(&content).ok();
1577        Err(Error::ResponseError(ResponseContent {
1578            status,
1579            content,
1580            entity
1581        }))
1582    }
1583}
1584
1585/// Чтобы получить список хранилищ проекта, отправьте GET-запрос на
1586/// `/api/v1/projects/{project_id}/resources/buckets`.
1587pub async fn get_project_storages(
1588    configuration: &configuration::Configuration,
1589    project_id: i32
1590) -> Result<models::GetProjectStorages200Response, Error<GetProjectStoragesError>> {
1591    // add a prefix to parameters to efficiently prevent name collisions
1592    let p_path_project_id = project_id;
1593
1594    let uri_str = format!(
1595        "{}/api/v1/projects/{project_id}/resources/buckets",
1596        configuration.base_path,
1597        project_id = p_path_project_id
1598    );
1599    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
1600
1601    if let Some(ref user_agent) = configuration.user_agent {
1602        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1603    }
1604    if let Some(ref token) = configuration.bearer_access_token {
1605        req_builder = req_builder.bearer_auth(token.to_owned());
1606    };
1607
1608    let req = req_builder.build()?;
1609    let resp = configuration.client.execute(req).await?;
1610
1611    let status = resp.status();
1612    let content_type = resp
1613        .headers()
1614        .get("content-type")
1615        .and_then(|v| v.to_str().ok())
1616        .unwrap_or("application/octet-stream");
1617    let content_type = super::ContentType::from(content_type);
1618
1619    if !status.is_client_error() && !status.is_server_error() {
1620        let content = resp.text().await?;
1621        match content_type {
1622            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1623            ContentType::Text => {
1624                return Err(Error::from(serde_json::Error::custom(
1625                    "Received `text/plain` content type response that cannot be converted to `models::GetProjectStorages200Response`"
1626                )));
1627            }
1628            ContentType::Unsupported(unknown_type) => {
1629                return Err(Error::from(serde_json::Error::custom(format!(
1630                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetProjectStorages200Response`"
1631                ))));
1632            }
1633        }
1634    } else {
1635        let content = resp.text().await?;
1636        let entity: Option<GetProjectStoragesError> = serde_json::from_str(&content).ok();
1637        Err(Error::ResponseError(ResponseContent {
1638            status,
1639            content,
1640            entity
1641        }))
1642    }
1643}
1644
1645/// Чтобы получить список всех проектов на вашем аккаунте, отправьте GET-запрос
1646/// на `/api/v1/projects`.   Тело ответа будет представлять собой объект JSON с
1647/// ключом `projects`.
1648pub async fn get_projects(
1649    configuration: &configuration::Configuration
1650) -> Result<models::GetProjects200Response, Error<GetProjectsError>> {
1651    let uri_str = format!("{}/api/v1/projects", configuration.base_path);
1652    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
1653
1654    if let Some(ref user_agent) = configuration.user_agent {
1655        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1656    }
1657    if let Some(ref token) = configuration.bearer_access_token {
1658        req_builder = req_builder.bearer_auth(token.to_owned());
1659    };
1660
1661    let req = req_builder.build()?;
1662    let resp = configuration.client.execute(req).await?;
1663
1664    let status = resp.status();
1665    let content_type = resp
1666        .headers()
1667        .get("content-type")
1668        .and_then(|v| v.to_str().ok())
1669        .unwrap_or("application/octet-stream");
1670    let content_type = super::ContentType::from(content_type);
1671
1672    if !status.is_client_error() && !status.is_server_error() {
1673        let content = resp.text().await?;
1674        match content_type {
1675            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1676            ContentType::Text => {
1677                return Err(Error::from(serde_json::Error::custom(
1678                    "Received `text/plain` content type response that cannot be converted to `models::GetProjects200Response`"
1679                )));
1680            }
1681            ContentType::Unsupported(unknown_type) => {
1682                return Err(Error::from(serde_json::Error::custom(format!(
1683                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetProjects200Response`"
1684                ))));
1685            }
1686        }
1687    } else {
1688        let content = resp.text().await?;
1689        let entity: Option<GetProjectsError> = serde_json::from_str(&content).ok();
1690        Err(Error::ResponseError(ResponseContent {
1691            status,
1692            content,
1693            entity
1694        }))
1695    }
1696}
1697
1698/// Чтобы перенести ресурс в другой проект, отправьте запрос PUT в
1699/// `api/v1/projects/{project_id}/resources/transfer`.
1700pub async fn transfer_resource_to_another_project(
1701    configuration: &configuration::Configuration,
1702    project_id: i32,
1703    resource_transfer: models::ResourceTransfer
1704) -> Result<models::AddBalancerToProject200Response, Error<TransferResourceToAnotherProjectError>>
1705{
1706    // add a prefix to parameters to efficiently prevent name collisions
1707    let p_path_project_id = project_id;
1708    let p_body_resource_transfer = resource_transfer;
1709
1710    let uri_str = format!(
1711        "{}/api/v1/projects/{project_id}/resources/transfer",
1712        configuration.base_path,
1713        project_id = p_path_project_id
1714    );
1715    let mut req_builder = configuration.client.request(reqwest::Method::PUT, &uri_str);
1716
1717    if let Some(ref user_agent) = configuration.user_agent {
1718        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1719    }
1720    if let Some(ref token) = configuration.bearer_access_token {
1721        req_builder = req_builder.bearer_auth(token.to_owned());
1722    };
1723    req_builder = req_builder.json(&p_body_resource_transfer);
1724
1725    let req = req_builder.build()?;
1726    let resp = configuration.client.execute(req).await?;
1727
1728    let status = resp.status();
1729    let content_type = resp
1730        .headers()
1731        .get("content-type")
1732        .and_then(|v| v.to_str().ok())
1733        .unwrap_or("application/octet-stream");
1734    let content_type = super::ContentType::from(content_type);
1735
1736    if !status.is_client_error() && !status.is_server_error() {
1737        let content = resp.text().await?;
1738        match content_type {
1739            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1740            ContentType::Text => {
1741                return Err(Error::from(serde_json::Error::custom(
1742                    "Received `text/plain` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
1743                )));
1744            }
1745            ContentType::Unsupported(unknown_type) => {
1746                return Err(Error::from(serde_json::Error::custom(format!(
1747                    "Received `{unknown_type}` content type response that cannot be converted to `models::AddBalancerToProject200Response`"
1748                ))));
1749            }
1750        }
1751    } else {
1752        let content = resp.text().await?;
1753        let entity: Option<TransferResourceToAnotherProjectError> =
1754            serde_json::from_str(&content).ok();
1755        Err(Error::ResponseError(ResponseContent {
1756            status,
1757            content,
1758            entity
1759        }))
1760    }
1761}
1762
1763/// Чтобы изменить проект, отправьте запрос PUT в
1764/// `api/v1/projects/{project_id}`.
1765pub async fn update_project(
1766    configuration: &configuration::Configuration,
1767    project_id: i32,
1768    update_project: models::UpdateProject
1769) -> Result<models::CreateProject201Response, Error<UpdateProjectError>> {
1770    // add a prefix to parameters to efficiently prevent name collisions
1771    let p_path_project_id = project_id;
1772    let p_body_update_project = update_project;
1773
1774    let uri_str = format!(
1775        "{}/api/v1/projects/{project_id}",
1776        configuration.base_path,
1777        project_id = p_path_project_id
1778    );
1779    let mut req_builder = configuration.client.request(reqwest::Method::PUT, &uri_str);
1780
1781    if let Some(ref user_agent) = configuration.user_agent {
1782        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1783    }
1784    if let Some(ref token) = configuration.bearer_access_token {
1785        req_builder = req_builder.bearer_auth(token.to_owned());
1786    };
1787    req_builder = req_builder.json(&p_body_update_project);
1788
1789    let req = req_builder.build()?;
1790    let resp = configuration.client.execute(req).await?;
1791
1792    let status = resp.status();
1793    let content_type = resp
1794        .headers()
1795        .get("content-type")
1796        .and_then(|v| v.to_str().ok())
1797        .unwrap_or("application/octet-stream");
1798    let content_type = super::ContentType::from(content_type);
1799
1800    if !status.is_client_error() && !status.is_server_error() {
1801        let content = resp.text().await?;
1802        match content_type {
1803            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1804            ContentType::Text => {
1805                return Err(Error::from(serde_json::Error::custom(
1806                    "Received `text/plain` content type response that cannot be converted to `models::CreateProject201Response`"
1807                )));
1808            }
1809            ContentType::Unsupported(unknown_type) => {
1810                return Err(Error::from(serde_json::Error::custom(format!(
1811                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateProject201Response`"
1812                ))));
1813            }
1814        }
1815    } else {
1816        let content = resp.text().await?;
1817        let entity: Option<UpdateProjectError> = serde_json::from_str(&content).ok();
1818        Err(Error::ResponseError(ResponseContent {
1819            status,
1820            content,
1821            entity
1822        }))
1823    }
1824}