Skip to main content

timeweb_rs/apis/
container_registry_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_registry`]
18#[derive(Debug, Clone, Serialize, Deserialize)]
19#[serde(untagged)]
20pub enum CreateRegistryError {
21    Status400(models::GetFinances400Response),
22    Status401(models::GetFinances401Response),
23    Status429(models::GetFinances429Response),
24    Status500(models::GetFinances500Response),
25    UnknownValue(serde_json::Value)
26}
27
28/// struct for typed errors of method [`delete_registry`]
29#[derive(Debug, Clone, Serialize, Deserialize)]
30#[serde(untagged)]
31pub enum DeleteRegistryError {
32    Status400(models::GetFinances400Response),
33    Status401(models::GetFinances401Response),
34    Status403(models::GetAccountStatus403Response),
35    Status404(models::GetImage404Response),
36    Status429(models::GetFinances429Response),
37    Status500(models::GetFinances500Response),
38    UnknownValue(serde_json::Value)
39}
40
41/// struct for typed errors of method [`get_registries`]
42#[derive(Debug, Clone, Serialize, Deserialize)]
43#[serde(untagged)]
44pub enum GetRegistriesError {
45    Status400(models::GetFinances400Response),
46    Status401(models::GetFinances401Response),
47    Status429(models::GetFinances429Response),
48    Status500(models::GetFinances500Response),
49    UnknownValue(serde_json::Value)
50}
51
52/// struct for typed errors of method [`get_registry`]
53#[derive(Debug, Clone, Serialize, Deserialize)]
54#[serde(untagged)]
55pub enum GetRegistryError {
56    Status400(models::GetFinances400Response),
57    Status401(models::GetFinances401Response),
58    Status403(models::GetAccountStatus403Response),
59    Status404(models::GetImage404Response),
60    Status429(models::GetFinances429Response),
61    Status500(models::GetFinances500Response),
62    UnknownValue(serde_json::Value)
63}
64
65/// struct for typed errors of method [`get_registry_presets`]
66#[derive(Debug, Clone, Serialize, Deserialize)]
67#[serde(untagged)]
68pub enum GetRegistryPresetsError {
69    Status400(models::GetFinances400Response),
70    Status401(models::GetFinances401Response),
71    Status429(models::GetFinances429Response),
72    Status500(models::GetFinances500Response),
73    UnknownValue(serde_json::Value)
74}
75
76/// struct for typed errors of method [`get_registry_repositories`]
77#[derive(Debug, Clone, Serialize, Deserialize)]
78#[serde(untagged)]
79pub enum GetRegistryRepositoriesError {
80    Status400(models::GetFinances400Response),
81    Status401(models::GetFinances401Response),
82    Status429(models::GetFinances429Response),
83    Status500(models::GetFinances500Response),
84    UnknownValue(serde_json::Value)
85}
86
87/// struct for typed errors of method [`update_registry`]
88#[derive(Debug, Clone, Serialize, Deserialize)]
89#[serde(untagged)]
90pub enum UpdateRegistryError {
91    Status400(models::GetFinances400Response),
92    Status401(models::GetFinances401Response),
93    Status403(models::GetAccountStatus403Response),
94    Status404(models::GetImage404Response),
95    Status429(models::GetFinances429Response),
96    Status500(models::GetFinances500Response),
97    UnknownValue(serde_json::Value)
98}
99
100/// Чтобы создать реестр, отправьте POST-запрос на `/api/v1/container-registry`.
101pub async fn create_registry(
102    configuration: &configuration::Configuration,
103    registry_in: models::RegistryIn
104) -> Result<models::CreateRegistry201Response, Error<CreateRegistryError>> {
105    // add a prefix to parameters to efficiently prevent name collisions
106    let p_body_registry_in = registry_in;
107
108    let uri_str = format!("{}/api/v1/container-registry", configuration.base_path);
109    let mut req_builder = configuration
110        .client
111        .request(reqwest::Method::POST, &uri_str);
112
113    if let Some(ref user_agent) = configuration.user_agent {
114        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
115    }
116    if let Some(ref token) = configuration.bearer_access_token {
117        req_builder = req_builder.bearer_auth(token.to_owned());
118    };
119    req_builder = req_builder.json(&p_body_registry_in);
120
121    let req = req_builder.build()?;
122    let resp = configuration.client.execute(req).await?;
123
124    let status = resp.status();
125    let content_type = resp
126        .headers()
127        .get("content-type")
128        .and_then(|v| v.to_str().ok())
129        .unwrap_or("application/octet-stream");
130    let content_type = super::ContentType::from(content_type);
131
132    if !status.is_client_error() && !status.is_server_error() {
133        let content = resp.text().await?;
134        match content_type {
135            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
136            ContentType::Text => {
137                return Err(Error::from(serde_json::Error::custom(
138                    "Received `text/plain` content type response that cannot be converted to `models::CreateRegistry201Response`"
139                )));
140            }
141            ContentType::Unsupported(unknown_type) => {
142                return Err(Error::from(serde_json::Error::custom(format!(
143                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateRegistry201Response`"
144                ))));
145            }
146        }
147    } else {
148        let content = resp.text().await?;
149        let entity: Option<CreateRegistryError> = serde_json::from_str(&content).ok();
150        Err(Error::ResponseError(ResponseContent {
151            status,
152            content,
153            entity
154        }))
155    }
156}
157
158/// Чтобы удалить реестр, отправьте DELETE-запрос в
159/// `/api/v1/container-registry/{registry_id}`
160pub async fn delete_registry(
161    configuration: &configuration::Configuration,
162    registry_id: i32
163) -> Result<(), Error<DeleteRegistryError>> {
164    // add a prefix to parameters to efficiently prevent name collisions
165    let p_path_registry_id = registry_id;
166
167    let uri_str = format!(
168        "{}/api/v1/container-registry/{registry_id}",
169        configuration.base_path,
170        registry_id = p_path_registry_id
171    );
172    let mut req_builder = configuration
173        .client
174        .request(reqwest::Method::DELETE, &uri_str);
175
176    if let Some(ref user_agent) = configuration.user_agent {
177        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
178    }
179    if let Some(ref token) = configuration.bearer_access_token {
180        req_builder = req_builder.bearer_auth(token.to_owned());
181    };
182
183    let req = req_builder.build()?;
184    let resp = configuration.client.execute(req).await?;
185
186    let status = resp.status();
187
188    if !status.is_client_error() && !status.is_server_error() {
189        Ok(())
190    } else {
191        let content = resp.text().await?;
192        let entity: Option<DeleteRegistryError> = serde_json::from_str(&content).ok();
193        Err(Error::ResponseError(ResponseContent {
194            status,
195            content,
196            entity
197        }))
198    }
199}
200
201/// Чтобы получить список реестров, отправьте GET-запрос на
202/// `/api/v1/container-registry`.
203pub async fn get_registries(
204    configuration: &configuration::Configuration
205) -> Result<models::GetRegistries200Response, Error<GetRegistriesError>> {
206    let uri_str = format!("{}/api/v1/container-registry", configuration.base_path);
207    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
208
209    if let Some(ref user_agent) = configuration.user_agent {
210        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
211    }
212    if let Some(ref token) = configuration.bearer_access_token {
213        req_builder = req_builder.bearer_auth(token.to_owned());
214    };
215
216    let req = req_builder.build()?;
217    let resp = configuration.client.execute(req).await?;
218
219    let status = resp.status();
220    let content_type = resp
221        .headers()
222        .get("content-type")
223        .and_then(|v| v.to_str().ok())
224        .unwrap_or("application/octet-stream");
225    let content_type = super::ContentType::from(content_type);
226
227    if !status.is_client_error() && !status.is_server_error() {
228        let content = resp.text().await?;
229        match content_type {
230            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
231            ContentType::Text => {
232                return Err(Error::from(serde_json::Error::custom(
233                    "Received `text/plain` content type response that cannot be converted to `models::GetRegistries200Response`"
234                )));
235            }
236            ContentType::Unsupported(unknown_type) => {
237                return Err(Error::from(serde_json::Error::custom(format!(
238                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetRegistries200Response`"
239                ))));
240            }
241        }
242    } else {
243        let content = resp.text().await?;
244        let entity: Option<GetRegistriesError> = serde_json::from_str(&content).ok();
245        Err(Error::ResponseError(ResponseContent {
246            status,
247            content,
248            entity
249        }))
250    }
251}
252
253/// Чтобы получить информацию о реестре, отправьте GET-запрос в
254/// `/api/v1/container-registry/{registry_id}`
255pub async fn get_registry(
256    configuration: &configuration::Configuration,
257    registry_id: i32
258) -> Result<models::CreateRegistry201Response, Error<GetRegistryError>> {
259    // add a prefix to parameters to efficiently prevent name collisions
260    let p_path_registry_id = registry_id;
261
262    let uri_str = format!(
263        "{}/api/v1/container-registry/{registry_id}",
264        configuration.base_path,
265        registry_id = p_path_registry_id
266    );
267    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
268
269    if let Some(ref user_agent) = configuration.user_agent {
270        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
271    }
272    if let Some(ref token) = configuration.bearer_access_token {
273        req_builder = req_builder.bearer_auth(token.to_owned());
274    };
275
276    let req = req_builder.build()?;
277    let resp = configuration.client.execute(req).await?;
278
279    let status = resp.status();
280    let content_type = resp
281        .headers()
282        .get("content-type")
283        .and_then(|v| v.to_str().ok())
284        .unwrap_or("application/octet-stream");
285    let content_type = super::ContentType::from(content_type);
286
287    if !status.is_client_error() && !status.is_server_error() {
288        let content = resp.text().await?;
289        match content_type {
290            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
291            ContentType::Text => {
292                return Err(Error::from(serde_json::Error::custom(
293                    "Received `text/plain` content type response that cannot be converted to `models::CreateRegistry201Response`"
294                )));
295            }
296            ContentType::Unsupported(unknown_type) => {
297                return Err(Error::from(serde_json::Error::custom(format!(
298                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateRegistry201Response`"
299                ))));
300            }
301        }
302    } else {
303        let content = resp.text().await?;
304        let entity: Option<GetRegistryError> = serde_json::from_str(&content).ok();
305        Err(Error::ResponseError(ResponseContent {
306            status,
307            content,
308            entity
309        }))
310    }
311}
312
313/// Чтобы получить список тарифов, отправьте GET-запрос в
314/// `/api/v1/container-registry/presets`.
315pub async fn get_registry_presets(
316    configuration: &configuration::Configuration
317) -> Result<models::GetRegistryPresets200Response, Error<GetRegistryPresetsError>> {
318    let uri_str = format!(
319        "{}/api/v1/container-registry/presets",
320        configuration.base_path
321    );
322    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
323
324    if let Some(ref user_agent) = configuration.user_agent {
325        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
326    }
327    if let Some(ref token) = configuration.bearer_access_token {
328        req_builder = req_builder.bearer_auth(token.to_owned());
329    };
330
331    let req = req_builder.build()?;
332    let resp = configuration.client.execute(req).await?;
333
334    let status = resp.status();
335    let content_type = resp
336        .headers()
337        .get("content-type")
338        .and_then(|v| v.to_str().ok())
339        .unwrap_or("application/octet-stream");
340    let content_type = super::ContentType::from(content_type);
341
342    if !status.is_client_error() && !status.is_server_error() {
343        let content = resp.text().await?;
344        match content_type {
345            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
346            ContentType::Text => {
347                return Err(Error::from(serde_json::Error::custom(
348                    "Received `text/plain` content type response that cannot be converted to `models::GetRegistryPresets200Response`"
349                )));
350            }
351            ContentType::Unsupported(unknown_type) => {
352                return Err(Error::from(serde_json::Error::custom(format!(
353                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetRegistryPresets200Response`"
354                ))));
355            }
356        }
357    } else {
358        let content = resp.text().await?;
359        let entity: Option<GetRegistryPresetsError> = serde_json::from_str(&content).ok();
360        Err(Error::ResponseError(ResponseContent {
361            status,
362            content,
363            entity
364        }))
365    }
366}
367
368/// Чтобы получить список репозиториев, отправьте GET-запрос в
369/// `/api/v1/container-registry/{registry_id}/repositories`.
370pub async fn get_registry_repositories(
371    configuration: &configuration::Configuration,
372    registry_id: i32
373) -> Result<models::GetRegistryRepositories200Response, Error<GetRegistryRepositoriesError>> {
374    // add a prefix to parameters to efficiently prevent name collisions
375    let p_path_registry_id = registry_id;
376
377    let uri_str = format!(
378        "{}/api/v1/container-registry/{registry_id}/repositories",
379        configuration.base_path,
380        registry_id = p_path_registry_id
381    );
382    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
383
384    if let Some(ref user_agent) = configuration.user_agent {
385        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
386    }
387    if let Some(ref token) = configuration.bearer_access_token {
388        req_builder = req_builder.bearer_auth(token.to_owned());
389    };
390
391    let req = req_builder.build()?;
392    let resp = configuration.client.execute(req).await?;
393
394    let status = resp.status();
395    let content_type = resp
396        .headers()
397        .get("content-type")
398        .and_then(|v| v.to_str().ok())
399        .unwrap_or("application/octet-stream");
400    let content_type = super::ContentType::from(content_type);
401
402    if !status.is_client_error() && !status.is_server_error() {
403        let content = resp.text().await?;
404        match content_type {
405            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
406            ContentType::Text => {
407                return Err(Error::from(serde_json::Error::custom(
408                    "Received `text/plain` content type response that cannot be converted to `models::GetRegistryRepositories200Response`"
409                )));
410            }
411            ContentType::Unsupported(unknown_type) => {
412                return Err(Error::from(serde_json::Error::custom(format!(
413                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetRegistryRepositories200Response`"
414                ))));
415            }
416        }
417    } else {
418        let content = resp.text().await?;
419        let entity: Option<GetRegistryRepositoriesError> = serde_json::from_str(&content).ok();
420        Err(Error::ResponseError(ResponseContent {
421            status,
422            content,
423            entity
424        }))
425    }
426}
427
428/// Чтобы обновить информацию о реестре, отправьте PATCH-запрос в
429/// `/api/v1/container-registry/{registry_id}`
430pub async fn update_registry(
431    configuration: &configuration::Configuration,
432    registry_id: i32,
433    registry_edit: models::RegistryEdit
434) -> Result<models::CreateRegistry201Response, Error<UpdateRegistryError>> {
435    // add a prefix to parameters to efficiently prevent name collisions
436    let p_path_registry_id = registry_id;
437    let p_body_registry_edit = registry_edit;
438
439    let uri_str = format!(
440        "{}/api/v1/container-registry/{registry_id}",
441        configuration.base_path,
442        registry_id = p_path_registry_id
443    );
444    let mut req_builder = configuration
445        .client
446        .request(reqwest::Method::PATCH, &uri_str);
447
448    if let Some(ref user_agent) = configuration.user_agent {
449        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
450    }
451    if let Some(ref token) = configuration.bearer_access_token {
452        req_builder = req_builder.bearer_auth(token.to_owned());
453    };
454    req_builder = req_builder.json(&p_body_registry_edit);
455
456    let req = req_builder.build()?;
457    let resp = configuration.client.execute(req).await?;
458
459    let status = resp.status();
460    let content_type = resp
461        .headers()
462        .get("content-type")
463        .and_then(|v| v.to_str().ok())
464        .unwrap_or("application/octet-stream");
465    let content_type = super::ContentType::from(content_type);
466
467    if !status.is_client_error() && !status.is_server_error() {
468        let content = resp.text().await?;
469        match content_type {
470            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
471            ContentType::Text => {
472                return Err(Error::from(serde_json::Error::custom(
473                    "Received `text/plain` content type response that cannot be converted to `models::CreateRegistry201Response`"
474                )));
475            }
476            ContentType::Unsupported(unknown_type) => {
477                return Err(Error::from(serde_json::Error::custom(format!(
478                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateRegistry201Response`"
479                ))));
480            }
481        }
482    } else {
483        let content = resp.text().await?;
484        let entity: Option<UpdateRegistryError> = serde_json::from_str(&content).ok();
485        Err(Error::ResponseError(ResponseContent {
486            status,
487            content,
488            entity
489        }))
490    }
491}