Skip to main content

gitverse_sdk/
types.rs

1// Code generated by gitverse-codegen. DO NOT EDIT.
2
3use serde::{Deserialize, Serialize};
4
5/// Опции для запросов с пагинацией и фильтрацией
6#[derive(Debug, Clone, Default, Serialize, Deserialize)]
7pub struct QueryOptions {
8    /// Номер страницы
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub page: Option<i64>,
11    /// Количество элементов на странице
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub per_page: Option<i64>,
14
15    /// Фильтр по состоянию
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub state: Option<String>,
18    /// Сортировка
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub sort: Option<String>,
21    /// Направление сортировки
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub direction: Option<String>,
24    /// Порядок
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub order: Option<String>,
27    /// Тип
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub r#type: Option<String>,
30    /// Область поиска
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub scope: Option<String>,
33
34    /// Поисковый запрос
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub q: Option<String>,
37
38    /// Git ref
39    #[serde(rename = "ref")]
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub git_ref: Option<String>,
42    /// SHA коммита
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub sha: Option<String>,
45    /// Путь к файлу
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub path: Option<String>,
48    /// Ветка
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub branch: Option<String>,
51    /// Тег
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub tag: Option<String>,
54    /// Базовая ветка
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub base: Option<String>,
57    /// Целевая ветка
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub head: Option<String>,
60    /// Рекурсивный поиск
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub recursive: Option<bool>,
63
64    /// Фильтр по черновикам
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub draft: Option<bool>,
67
68    /// Метки
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub labels: Option<String>,
71    /// Милестоуны
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub milestones: Option<String>,
74    /// Назначен
75    #[serde(skip_serializing_if = "Option::is_none")]
76    pub assigned_by: Option<String>,
77    /// Упомянут
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub mentioned_by: Option<String>,
80    /// Создан
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub created_by: Option<String>,
83    /// Автор
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub author: Option<String>,
86    /// Коммиттер
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub committer: Option<String>,
89
90    /// Дата начала
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub since: Option<String>,
93    /// Дата окончания
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub until: Option<String>,
96    /// До даты
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub before: Option<String>,
99
100    /// Принадлежность
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub affiliation: Option<String>,
103    /// Права доступа
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub permission: Option<String>,
106    /// Исключение
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub not: Option<String>,
109
110    /// Имя
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub name: Option<String>,
113    /// Пре-релиз
114    #[serde(skip_serializing_if = "Option::is_none")]
115    pub pre_release: Option<bool>,
116    /// Зашифрованное значение
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub encrypted_value: Option<String>,
119}
120
121/// Информация о пагинации
122#[derive(Debug, Clone, Serialize, Deserialize)]
123pub struct PaginationInfo {
124    pub page: i64,
125    pub per_page: i64,
126    pub total: i64,
127    pub total_pages: i64,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize)]
131pub struct AddCollaboratorParams {
132    /// enum: read,write,admin
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub permission: Option<String>,
135}
136
137#[derive(Debug, Clone, Serialize, Deserialize)]
138pub struct CommitUserParams {
139    #[serde(skip_serializing_if = "Option::is_none")]
140    pub date: Option<String>,
141    pub email: String,
142    pub name: String,
143}
144
145#[derive(Debug, Clone, Serialize, Deserialize)]
146pub struct CreateActionLinkParams {
147    #[serde(skip_serializing_if = "Option::is_none")]
148    pub description: Option<String>,
149    #[serde(skip_serializing_if = "Option::is_none")]
150    pub link: Option<String>,
151    #[serde(skip_serializing_if = "Option::is_none")]
152    pub name: Option<String>,
153    #[serde(skip_serializing_if = "Option::is_none")]
154    pub run_id: Option<f64>,
155}
156
157#[derive(Debug, Clone, Serialize, Deserialize)]
158pub struct CreateCommitParams {
159    #[serde(skip_serializing_if = "Option::is_none")]
160    pub author: Option<CommitUserParams>,
161    #[serde(skip_serializing_if = "Option::is_none")]
162    pub committer: Option<CommitUserParams>,
163    pub message: String,
164    #[serde(skip_serializing_if = "Option::is_none")]
165    pub parents: Option<Vec<String>>,
166    pub tree: String,
167}
168
169#[derive(Debug, Clone, Serialize, Deserialize)]
170pub struct CreateEmailParams {
171    #[serde(skip_serializing_if = "Option::is_none")]
172    pub emails: Option<Vec<String>>,
173}
174
175#[derive(Debug, Clone, Serialize, Deserialize)]
176pub struct CreateIssueCommentParams {
177    #[serde(skip_serializing_if = "Option::is_none")]
178    pub body: Option<String>,
179    #[serde(skip_serializing_if = "Option::is_none")]
180    pub is_review: Option<bool>,
181    #[serde(skip_serializing_if = "Option::is_none")]
182    pub is_thread: Option<bool>,
183    #[serde(skip_serializing_if = "Option::is_none")]
184    pub reply_to: Option<f64>,
185    #[serde(skip_serializing_if = "Option::is_none")]
186    pub thread_id: Option<f64>,
187}
188
189#[derive(Debug, Clone, Serialize, Deserialize)]
190pub struct CreateFileParams {
191    /// ветка на которой будет базировать коммит, если пустая то будет использована ветка по умолчанию
192    #[serde(skip_serializing_if = "Option::is_none")]
193    pub branch: Option<String>,
194    /// content must be base64 encoded
195    #[serde(skip_serializing_if = "Option::is_none")]
196    pub content: Option<String>,
197    /// SHA string `json:"sha" binding:"Required"`
198    #[serde(skip_serializing_if = "Option::is_none")]
199    pub from_path: Option<String>,
200    /// Сообщение для описания коммита, если пустое то будет использовано сообщение по умолчанию
201    #[serde(skip_serializing_if = "Option::is_none")]
202    pub message: Option<String>,
203    /// новая ветка которая будет отведена от указанной выше ветки и вней будет создан новый коммит
204    #[serde(skip_serializing_if = "Option::is_none")]
205    pub new_branch: Option<String>,
206    /// sha is the SHA for the file that already exists
207    #[serde(skip_serializing_if = "Option::is_none")]
208    pub sha: Option<String>,
209    /// Подписывать ли коммит
210    #[serde(skip_serializing_if = "Option::is_none")]
211    pub signoff: Option<bool>,
212}
213
214#[derive(Debug, Clone, Serialize, Deserialize)]
215pub struct CreateOrgRepositoryParams {
216    /// either `true` to allow merging pull requests with a merge commit, or `false` to prevent merging pull requests with merge commits.
217    #[serde(skip_serializing_if = "Option::is_none")]
218    pub allow_merge_commit: Option<bool>,
219    /// either `true` to allow rebase with explicit merge commits (--no-ff), or `false` to prevent rebase with explicit merge commits.
220    #[serde(skip_serializing_if = "Option::is_none")]
221    pub allow_rebase_merge: Option<bool>,
222    /// either `true` to allow squash-merging pull requests, or `false` to prevent squash-merging.
223    #[serde(skip_serializing_if = "Option::is_none")]
224    pub allow_squash_merge: Option<bool>,
225    /// Whether the repository should be auto-initialized?
226    #[serde(skip_serializing_if = "Option::is_none")]
227    pub auto_init: Option<bool>,
228    /// DefaultBranch of the repository (used when initializes and in template)
229    #[serde(skip_serializing_if = "Option::is_none")]
230    pub default_branch: Option<String>,
231    /// set to `true` to delete pr branch after merge by default
232    #[serde(skip_serializing_if = "Option::is_none")]
233    pub delete_branch_on_merge: Option<bool>,
234    /// Description of the repository to create
235    #[serde(skip_serializing_if = "Option::is_none")]
236    pub description: Option<String>,
237    /// Gitignores is a list of gitignore templates to use
238    #[serde(skip_serializing_if = "Option::is_none")]
239    pub gitignores: Option<Vec<String>>,
240    /// Whether the repository is template
241    #[serde(skip_serializing_if = "Option::is_none")]
242    pub is_template: Option<bool>,
243    /// License to use
244    #[serde(skip_serializing_if = "Option::is_none")]
245    pub license_template: Option<String>,
246    /// Name of the repository to create
247    #[serde(skip_serializing_if = "Option::is_none")]
248    pub name: Option<String>,
249    /// Private indicates whether the repository is private
250    #[serde(skip_serializing_if = "Option::is_none")]
251    pub private: Option<bool>,
252    /// Visibility controls the repository visibility and has priority over Private
253    #[serde(skip_serializing_if = "Option::is_none")]
254    pub visibility: Option<String>,
255}
256
257#[derive(Debug, Clone, Serialize, Deserialize)]
258pub struct CreatePagesDeploymentParams {
259    #[serde(skip_serializing_if = "Option::is_none")]
260    pub artifact_id: Option<f64>,
261}
262
263#[derive(Debug, Clone, Serialize, Deserialize)]
264pub struct CreatePullRequestParams {
265    /// список ответственных
266    #[serde(skip_serializing_if = "Option::is_none")]
267    pub assignees: Option<Vec<String>>,
268    /// ветка в которую происходит слияние
269    #[serde(skip_serializing_if = "Option::is_none")]
270    pub base: Option<String>,
271    /// тело запроса
272    #[serde(skip_serializing_if = "Option::is_none")]
273    pub body: Option<String>,
274    /// черновик
275    #[serde(skip_serializing_if = "Option::is_none")]
276    pub draft: Option<bool>,
277    /// Deadline
278    #[serde(skip_serializing_if = "Option::is_none")]
279    pub due_date: Option<String>,
280    /// ветка из которой происходит слияние
281    #[serde(skip_serializing_if = "Option::is_none")]
282    pub head: Option<String>,
283    /// ветка из которой происходит слияние
284    #[serde(skip_serializing_if = "Option::is_none")]
285    pub head_repo: Option<String>,
286    /// Метки
287    #[serde(skip_serializing_if = "Option::is_none")]
288    pub labels: Option<Vec<f64>>,
289    /// могут ли мэйнтейнеры изменять PR
290    #[serde(skip_serializing_if = "Option::is_none")]
291    pub maintainer_can_modify: Option<bool>,
292    /// идентификатор "этапа"
293    #[serde(skip_serializing_if = "Option::is_none")]
294    pub milestone: Option<f64>,
295    /// заголовок запроса
296    #[serde(skip_serializing_if = "Option::is_none")]
297    pub title: Option<String>,
298}
299
300#[derive(Debug, Clone, Serialize, Deserialize)]
301pub struct CreateIssueCommentReactionParams {
302    #[serde(skip_serializing_if = "Option::is_none")]
303    pub content: Option<String>,
304}
305
306#[derive(Debug, Clone, Serialize, Deserialize)]
307pub struct CreateReferenceParams {
308    #[serde(skip_serializing_if = "Option::is_none")]
309    pub r#ref: Option<String>,
310    #[serde(skip_serializing_if = "Option::is_none")]
311    pub sha: Option<String>,
312}
313
314#[derive(Debug, Clone, Serialize, Deserialize)]
315pub struct CreateReleaseParams {
316    #[serde(skip_serializing_if = "Option::is_none")]
317    pub body: Option<String>,
318    #[serde(skip_serializing_if = "Option::is_none")]
319    pub draft: Option<bool>,
320    #[serde(skip_serializing_if = "Option::is_none")]
321    pub is_authorized_only: Option<bool>,
322    #[serde(skip_serializing_if = "Option::is_none")]
323    pub name: Option<String>,
324    #[serde(skip_serializing_if = "Option::is_none")]
325    pub prerelease: Option<bool>,
326    #[serde(skip_serializing_if = "Option::is_none")]
327    pub tag_name: Option<String>,
328    #[serde(skip_serializing_if = "Option::is_none")]
329    pub target_commitish: Option<String>,
330}
331
332#[derive(Debug, Clone, Serialize, Deserialize)]
333pub struct CreateRepositoryParams {
334    #[serde(skip_serializing_if = "Option::is_none")]
335    pub auto_init: Option<bool>,
336    #[serde(skip_serializing_if = "Option::is_none")]
337    pub description: Option<String>,
338    #[serde(skip_serializing_if = "Option::is_none")]
339    pub gitignores: Option<Vec<String>>,
340    #[serde(skip_serializing_if = "Option::is_none")]
341    pub is_template: Option<bool>,
342    #[serde(skip_serializing_if = "Option::is_none")]
343    pub name: Option<String>,
344    #[serde(skip_serializing_if = "Option::is_none")]
345    pub private: Option<bool>,
346}
347
348#[derive(Debug, Clone, Serialize, Deserialize)]
349pub struct TreeItem {
350    #[serde(skip_serializing_if = "Option::is_none")]
351    pub content: Option<String>,
352    #[serde(skip_serializing_if = "Option::is_none")]
353    pub mode: Option<String>,
354    #[serde(skip_serializing_if = "Option::is_none")]
355    pub path: Option<String>,
356    #[serde(skip_serializing_if = "Option::is_none")]
357    pub sha: Option<String>,
358    #[serde(skip_serializing_if = "Option::is_none")]
359    pub r#type: Option<String>,
360}
361
362#[derive(Debug, Clone, Serialize, Deserialize)]
363pub struct CreateTreeParams {
364    #[serde(skip_serializing_if = "Option::is_none")]
365    pub base_tree: Option<String>,
366    #[serde(skip_serializing_if = "Option::is_none")]
367    pub tree: Option<Vec<TreeItem>>,
368}
369
370#[derive(Debug, Clone, Serialize, Deserialize)]
371pub struct CreateVariableParams {
372    #[serde(skip_serializing_if = "Option::is_none")]
373    pub name: Option<String>,
374    #[serde(skip_serializing_if = "Option::is_none")]
375    pub value: Option<String>,
376}
377
378#[derive(Debug, Clone, Serialize, Deserialize)]
379pub struct CreateWebhookConfigParams {
380    #[serde(skip_serializing_if = "Option::is_none")]
381    pub authorization_header: Option<String>,
382    #[serde(skip_serializing_if = "Option::is_none")]
383    pub branch_filter: Option<String>,
384    #[serde(skip_serializing_if = "Option::is_none")]
385    pub content_type: Option<String>,
386    #[serde(skip_serializing_if = "Option::is_none")]
387    pub http_method: Option<String>,
388    #[serde(skip_serializing_if = "Option::is_none")]
389    pub url: Option<String>,
390}
391
392#[derive(Debug, Clone, Serialize, Deserialize)]
393pub struct CreateWebhookParams {
394    #[serde(skip_serializing_if = "Option::is_none")]
395    pub active: Option<bool>,
396    #[serde(skip_serializing_if = "Option::is_none")]
397    pub config: Option<CreateWebhookConfigParams>,
398    #[serde(skip_serializing_if = "Option::is_none")]
399    pub events: Option<Vec<String>>,
400}
401
402#[derive(Debug, Clone, Serialize, Deserialize)]
403pub struct DeleteEmailParams {
404    #[serde(skip_serializing_if = "Option::is_none")]
405    pub emails: Option<Vec<String>>,
406}
407
408#[derive(Debug, Clone, Serialize, Deserialize)]
409pub struct DeleteFileParams {
410    /// ветка на которой будет базировать коммит, если пустая то будет использована ветка по умолчанию
411    #[serde(skip_serializing_if = "Option::is_none")]
412    pub branch: Option<String>,
413    /// Сообщение для описания коммита, если пустое то будет использовано сообщение по умолчанию
414    #[serde(skip_serializing_if = "Option::is_none")]
415    pub message: Option<String>,
416    /// новая ветка которая будет отведена от указанной выше ветки и вней будет создан новый коммит
417    #[serde(skip_serializing_if = "Option::is_none")]
418    pub new_branch: Option<String>,
419    /// sha is the SHA for the file that already exists
420    #[serde(skip_serializing_if = "Option::is_none")]
421    pub sha: Option<String>,
422    /// Подписывать ли коммит
423    #[serde(skip_serializing_if = "Option::is_none")]
424    pub signoff: Option<bool>,
425}
426
427#[derive(Debug, Clone, Serialize, Deserialize)]
428pub struct UpdateReleaseParams {
429    #[serde(skip_serializing_if = "Option::is_none")]
430    pub body: Option<String>,
431    #[serde(skip_serializing_if = "Option::is_none")]
432    pub draft: Option<bool>,
433    #[serde(skip_serializing_if = "Option::is_none")]
434    pub is_authorized_only: Option<bool>,
435    #[serde(skip_serializing_if = "Option::is_none")]
436    pub name: Option<String>,
437    #[serde(skip_serializing_if = "Option::is_none")]
438    pub prerelease: Option<bool>,
439    #[serde(skip_serializing_if = "Option::is_none")]
440    pub tag_name: Option<String>,
441    #[serde(skip_serializing_if = "Option::is_none")]
442    pub target_commitish: Option<String>,
443}
444
445#[derive(Debug, Clone, Serialize, Deserialize)]
446pub struct CreateForkParams {
447    /// Описание
448    #[serde(skip_serializing_if = "Option::is_none")]
449    pub description: Option<String>,
450    /// Имя форкнутого репозитория
451    #[serde(skip_serializing_if = "Option::is_none")]
452    pub name: Option<String>,
453    /// Название организации, если форкаем в организацию
454    #[serde(skip_serializing_if = "Option::is_none")]
455    pub organization: Option<String>,
456}
457
458#[derive(Debug, Clone, Serialize, Deserialize)]
459pub struct UpdateRepositoryParams {
460    #[serde(skip_serializing_if = "Option::is_none")]
461    pub allow_auto_merge: Option<bool>,
462    #[serde(skip_serializing_if = "Option::is_none")]
463    pub allow_merge: Option<bool>,
464    #[serde(skip_serializing_if = "Option::is_none")]
465    pub allow_rebase: Option<bool>,
466    #[serde(skip_serializing_if = "Option::is_none")]
467    pub allow_rebase_merge: Option<bool>,
468    #[serde(skip_serializing_if = "Option::is_none")]
469    pub allow_squash_merge: Option<bool>,
470    #[serde(skip_serializing_if = "Option::is_none")]
471    pub allow_update_branch: Option<bool>,
472    #[serde(skip_serializing_if = "Option::is_none")]
473    pub archived: Option<bool>,
474    #[serde(skip_serializing_if = "Option::is_none")]
475    pub autodetect_manual_merge: Option<bool>,
476    #[serde(skip_serializing_if = "Option::is_none")]
477    pub default_allow_maintainer_edit: Option<bool>,
478    #[serde(skip_serializing_if = "Option::is_none")]
479    pub default_branch: Option<String>,
480    #[serde(skip_serializing_if = "Option::is_none")]
481    pub default_merge_style: Option<String>,
482    #[serde(skip_serializing_if = "Option::is_none")]
483    pub delete_branch_on_merge: Option<bool>,
484    #[serde(skip_serializing_if = "Option::is_none")]
485    pub description: Option<String>,
486    #[serde(skip_serializing_if = "Option::is_none")]
487    pub homepage: Option<String>,
488    #[serde(skip_serializing_if = "Option::is_none")]
489    pub ignore_whitespace: Option<bool>,
490    #[serde(skip_serializing_if = "Option::is_none")]
491    pub is_template: Option<bool>,
492    /// обработаны
493    #[serde(skip_serializing_if = "Option::is_none")]
494    pub name: Option<String>,
495    #[serde(skip_serializing_if = "Option::is_none")]
496    pub private: Option<bool>,
497}
498
499#[derive(Debug, Clone, Serialize, Deserialize)]
500pub struct TeamRepoPermissions {
501    #[serde(skip_serializing_if = "Option::is_none")]
502    pub permission: Option<String>,
503}
504
505#[derive(Debug, Clone, Serialize, Deserialize)]
506pub struct UpdateBranchParams {
507    #[serde(skip_serializing_if = "Option::is_none")]
508    pub expected_head_sha: Option<String>,
509}
510
511#[derive(Debug, Clone, Serialize, Deserialize)]
512pub struct UpdateIssueCommentParams {
513    #[serde(skip_serializing_if = "Option::is_none")]
514    pub body: Option<String>,
515}
516
517#[derive(Debug, Clone, Serialize, Deserialize)]
518pub struct UpdatePullRequestParams {
519    /// ветка в которую происходит слияние
520    #[serde(skip_serializing_if = "Option::is_none")]
521    pub base: Option<String>,
522    /// тело запроса
523    #[serde(skip_serializing_if = "Option::is_none")]
524    pub body: Option<String>,
525    /// могут ли мэйнтейнеры изменять PR
526    #[serde(skip_serializing_if = "Option::is_none")]
527    pub maintainer_can_modify: Option<bool>,
528    /// статус запроса
529    #[serde(skip_serializing_if = "Option::is_none")]
530    pub state: Option<String>,
531    /// заголовок запроса
532    #[serde(skip_serializing_if = "Option::is_none")]
533    pub title: Option<String>,
534}
535
536#[derive(Debug, Clone, Serialize, Deserialize)]
537pub struct UpdateWebhookConfigParams {
538    #[serde(skip_serializing_if = "Option::is_none")]
539    pub authorization_header: Option<String>,
540    #[serde(skip_serializing_if = "Option::is_none")]
541    pub branch_filter: Option<String>,
542    #[serde(skip_serializing_if = "Option::is_none")]
543    pub content_type: Option<String>,
544    #[serde(skip_serializing_if = "Option::is_none")]
545    pub http_method: Option<String>,
546    #[serde(skip_serializing_if = "Option::is_none")]
547    pub url: Option<String>,
548}
549
550#[derive(Debug, Clone, Serialize, Deserialize)]
551pub struct UpdateWebhookParams {
552    #[serde(skip_serializing_if = "Option::is_none")]
553    pub active: Option<bool>,
554    #[serde(skip_serializing_if = "Option::is_none")]
555    pub add_events: Option<Vec<String>>,
556    #[serde(skip_serializing_if = "Option::is_none")]
557    pub config: Option<UpdateWebhookConfigParams>,
558    #[serde(skip_serializing_if = "Option::is_none")]
559    pub events: Option<Vec<String>>,
560    #[serde(skip_serializing_if = "Option::is_none")]
561    pub remove_events: Option<Vec<String>>,
562}
563
564#[derive(Debug, Clone, Serialize, Deserialize)]
565pub struct ActionWorkflowRun {
566    #[serde(skip_serializing_if = "Option::is_none")]
567    pub head_sha: Option<String>,
568    #[serde(skip_serializing_if = "Option::is_none")]
569    pub id: Option<f64>,
570    #[serde(skip_serializing_if = "Option::is_none")]
571    pub repository_id: Option<f64>,
572}
573
574#[derive(Debug, Clone, Serialize, Deserialize)]
575pub struct ActionArtifact {
576    #[serde(skip_serializing_if = "Option::is_none")]
577    pub archive_download_url: Option<String>,
578    #[serde(skip_serializing_if = "Option::is_none")]
579    pub created_at: Option<String>,
580    #[serde(skip_serializing_if = "Option::is_none")]
581    pub expired: Option<bool>,
582    #[serde(skip_serializing_if = "Option::is_none")]
583    pub expires_at: Option<String>,
584    #[serde(skip_serializing_if = "Option::is_none")]
585    pub id: Option<f64>,
586    #[serde(skip_serializing_if = "Option::is_none")]
587    pub name: Option<String>,
588    #[serde(skip_serializing_if = "Option::is_none")]
589    pub size_in_bytes: Option<f64>,
590    #[serde(skip_serializing_if = "Option::is_none")]
591    pub updated_at: Option<String>,
592    #[serde(skip_serializing_if = "Option::is_none")]
593    pub url: Option<String>,
594    #[serde(skip_serializing_if = "Option::is_none")]
595    pub workflow_run: Option<ActionWorkflowRun>,
596}
597
598#[derive(Debug, Clone, Serialize, Deserialize)]
599pub struct ActionArtifactList {
600    #[serde(skip_serializing_if = "Option::is_none")]
601    pub artifacts: Option<Vec<ActionArtifact>>,
602    #[serde(skip_serializing_if = "Option::is_none")]
603    pub total_count: Option<f64>,
604}
605
606#[derive(Debug, Clone, Serialize, Deserialize)]
607pub struct ActionLink {
608    #[serde(skip_serializing_if = "Option::is_none")]
609    pub description: Option<String>,
610    #[serde(skip_serializing_if = "Option::is_none")]
611    pub id: Option<f64>,
612    #[serde(skip_serializing_if = "Option::is_none")]
613    pub link: Option<String>,
614    #[serde(skip_serializing_if = "Option::is_none")]
615    pub name: Option<String>,
616    #[serde(skip_serializing_if = "Option::is_none")]
617    pub run_id: Option<f64>,
618}
619
620#[derive(Debug, Clone, Serialize, Deserialize)]
621pub struct UserPublicInfo {
622    /// Ссылка на аватар
623    pub avatar_url: String,
624    /// Ссылка на список подписчиков пользователя
625    pub followers_url: String,
626    /// Ссылка на список пользователей, на которых подписан текущий пользователь
627    pub following_url: String,
628    /// Ссылка на профиль в веб-интерфейсе
629    pub html_url: String,
630    /// Уникальный идентификатор пользователя
631    pub id: f64,
632    /// Логин (уникальное имя)
633    pub login: String,
634    /// Ссылка на список организаций, в которых состоит пользователь
635    pub organizations_url: String,
636    /// Ссылка на список репозиториев пользователя
637    pub repos_url: String,
638    /// Является ли пользователь администратором платформы
639    pub site_admin: bool,
640    /// Тип: "user" или "organization"
641    pub r#type: String,
642    /// API-ссылка на пользователя
643    pub url: String,
644}
645
646#[derive(Debug, Clone, Serialize, Deserialize)]
647pub struct ActionRun {
648    #[serde(skip_serializing_if = "Option::is_none")]
649    pub actor: Option<UserPublicInfo>,
650    #[serde(skip_serializing_if = "Option::is_none")]
651    pub approved_by: Option<f64>,
652    #[serde(skip_serializing_if = "Option::is_none")]
653    pub commit_sha: Option<String>,
654    #[serde(skip_serializing_if = "Option::is_none")]
655    pub event: Option<String>,
656    #[serde(skip_serializing_if = "Option::is_none")]
657    pub id: Option<f64>,
658    #[serde(skip_serializing_if = "Option::is_none")]
659    pub index: Option<f64>,
660    #[serde(skip_serializing_if = "Option::is_none")]
661    pub is_fork_pull_request: Option<bool>,
662    #[serde(skip_serializing_if = "Option::is_none")]
663    pub name: Option<String>,
664    #[serde(skip_serializing_if = "Option::is_none")]
665    pub need_approval: Option<bool>,
666    #[serde(skip_serializing_if = "Option::is_none")]
667    pub r#ref: Option<String>,
668    #[serde(skip_serializing_if = "Option::is_none")]
669    pub started: Option<String>,
670    #[serde(skip_serializing_if = "Option::is_none")]
671    pub status: Option<String>,
672    #[serde(skip_serializing_if = "Option::is_none")]
673    pub stopped: Option<String>,
674    #[serde(skip_serializing_if = "Option::is_none")]
675    pub title: Option<String>,
676}
677
678#[derive(Debug, Clone, Serialize, Deserialize)]
679pub struct ActionRunJobStep {
680    #[serde(skip_serializing_if = "Option::is_none")]
681    pub completed_at: Option<String>,
682    #[serde(skip_serializing_if = "Option::is_none")]
683    pub name: Option<String>,
684    #[serde(skip_serializing_if = "Option::is_none")]
685    pub number: Option<f64>,
686    #[serde(skip_serializing_if = "Option::is_none")]
687    pub started_at: Option<String>,
688    #[serde(skip_serializing_if = "Option::is_none")]
689    pub status: Option<String>,
690}
691
692#[derive(Debug, Clone, Serialize, Deserialize)]
693pub struct ActionRunJob {
694    #[serde(skip_serializing_if = "Option::is_none")]
695    pub completed_at: Option<String>,
696    #[serde(skip_serializing_if = "Option::is_none")]
697    pub head_branch: Option<String>,
698    #[serde(skip_serializing_if = "Option::is_none")]
699    pub head_sha: Option<String>,
700    #[serde(skip_serializing_if = "Option::is_none")]
701    pub id: Option<f64>,
702    #[serde(skip_serializing_if = "Option::is_none")]
703    pub labels: Option<Vec<String>>,
704    #[serde(skip_serializing_if = "Option::is_none")]
705    pub name: Option<String>,
706    #[serde(skip_serializing_if = "Option::is_none")]
707    pub run_id: Option<f64>,
708    #[serde(skip_serializing_if = "Option::is_none")]
709    pub runner_id: Option<f64>,
710    #[serde(skip_serializing_if = "Option::is_none")]
711    pub runner_name: Option<String>,
712    #[serde(skip_serializing_if = "Option::is_none")]
713    pub started_at: Option<String>,
714    #[serde(skip_serializing_if = "Option::is_none")]
715    pub status: Option<String>,
716    #[serde(skip_serializing_if = "Option::is_none")]
717    pub steps: Option<Vec<ActionRunJobStep>>,
718    #[serde(skip_serializing_if = "Option::is_none")]
719    pub workflow_name: Option<String>,
720}
721
722#[derive(Debug, Clone, Serialize, Deserialize)]
723pub struct ActionRunnerLabel {
724    #[serde(skip_serializing_if = "Option::is_none")]
725    pub id: Option<f64>,
726    #[serde(skip_serializing_if = "Option::is_none")]
727    pub name: Option<String>,
728    #[serde(skip_serializing_if = "Option::is_none")]
729    pub r#type: Option<String>,
730}
731
732#[derive(Debug, Clone, Serialize, Deserialize)]
733pub struct ActionRunner {
734    #[serde(skip_serializing_if = "Option::is_none")]
735    pub busy: Option<bool>,
736    #[serde(skip_serializing_if = "Option::is_none")]
737    pub id: Option<f64>,
738    #[serde(skip_serializing_if = "Option::is_none")]
739    pub labels: Option<Vec<ActionRunnerLabel>>,
740    #[serde(skip_serializing_if = "Option::is_none")]
741    pub name: Option<String>,
742    #[serde(skip_serializing_if = "Option::is_none")]
743    pub status: Option<String>,
744}
745
746#[derive(Debug, Clone, Serialize, Deserialize)]
747pub struct ActionRunners {
748    #[serde(skip_serializing_if = "Option::is_none")]
749    pub runners: Option<Vec<ActionRunner>>,
750    #[serde(skip_serializing_if = "Option::is_none")]
751    pub total_count: Option<f64>,
752}
753
754#[derive(Debug, Clone, Serialize, Deserialize)]
755pub struct AssignmentClass {
756    #[serde(skip_serializing_if = "Option::is_none")]
757    pub archived: Option<bool>,
758    #[serde(skip_serializing_if = "Option::is_none")]
759    pub id: Option<f64>,
760    #[serde(skip_serializing_if = "Option::is_none")]
761    pub name: Option<String>,
762    #[serde(skip_serializing_if = "Option::is_none")]
763    pub url: Option<String>,
764}
765
766#[derive(Debug, Clone, Serialize, Deserialize)]
767pub struct AssignmentRepository {
768    #[serde(skip_serializing_if = "Option::is_none")]
769    pub default_branch: Option<String>,
770    #[serde(skip_serializing_if = "Option::is_none")]
771    pub full_name: Option<String>,
772    #[serde(skip_serializing_if = "Option::is_none")]
773    pub html_url: Option<String>,
774    #[serde(skip_serializing_if = "Option::is_none")]
775    pub id: Option<f64>,
776    #[serde(skip_serializing_if = "Option::is_none")]
777    pub node_id: Option<String>,
778    #[serde(skip_serializing_if = "Option::is_none")]
779    pub private: Option<bool>,
780}
781
782#[derive(Debug, Clone, Serialize, Deserialize)]
783pub struct Assignment {
784    #[serde(skip_serializing_if = "Option::is_none")]
785    pub accepted: Option<f64>,
786    #[serde(skip_serializing_if = "Option::is_none")]
787    pub deadline: Option<String>,
788    #[serde(skip_serializing_if = "Option::is_none")]
789    pub editor: Option<String>,
790    #[serde(skip_serializing_if = "Option::is_none")]
791    pub feedback_pull_requests_enabled: Option<bool>,
792    #[serde(skip_serializing_if = "Option::is_none")]
793    pub id: Option<f64>,
794    #[serde(skip_serializing_if = "Option::is_none")]
795    pub invitations_enabled: Option<bool>,
796    #[serde(skip_serializing_if = "Option::is_none")]
797    pub invite_link: Option<String>,
798    #[serde(skip_serializing_if = "Option::is_none")]
799    pub language: Option<String>,
800    #[serde(skip_serializing_if = "Option::is_none")]
801    pub max_members: Option<f64>,
802    #[serde(skip_serializing_if = "Option::is_none")]
803    pub max_teams: Option<f64>,
804    #[serde(skip_serializing_if = "Option::is_none")]
805    pub passing: Option<f64>,
806    #[serde(skip_serializing_if = "Option::is_none")]
807    pub public_repo: Option<bool>,
808    #[serde(skip_serializing_if = "Option::is_none")]
809    pub slug: Option<String>,
810    #[serde(skip_serializing_if = "Option::is_none")]
811    pub smartclass: Option<AssignmentClass>,
812    #[serde(skip_serializing_if = "Option::is_none")]
813    pub stater_code_repository: Option<AssignmentRepository>,
814    #[serde(skip_serializing_if = "Option::is_none")]
815    pub student_are_repo_admins: Option<bool>,
816    #[serde(skip_serializing_if = "Option::is_none")]
817    pub submitted: Option<f64>,
818    #[serde(skip_serializing_if = "Option::is_none")]
819    pub title: Option<String>,
820    #[serde(skip_serializing_if = "Option::is_none")]
821    pub r#type: Option<String>,
822}
823
824#[derive(Debug, Clone, Serialize, Deserialize)]
825pub struct Attachment {
826    #[serde(skip_serializing_if = "Option::is_none")]
827    pub browser_download_url: Option<String>,
828    #[serde(skip_serializing_if = "Option::is_none")]
829    pub created_at: Option<String>,
830    #[serde(skip_serializing_if = "Option::is_none")]
831    pub download_count: Option<f64>,
832    #[serde(skip_serializing_if = "Option::is_none")]
833    pub id: Option<f64>,
834    #[serde(skip_serializing_if = "Option::is_none")]
835    pub name: Option<String>,
836    #[serde(skip_serializing_if = "Option::is_none")]
837    pub size: Option<f64>,
838    #[serde(skip_serializing_if = "Option::is_none")]
839    pub uuid: Option<String>,
840}
841
842#[derive(Debug, Clone, Serialize, Deserialize)]
843pub struct CommitMeta {
844    #[serde(skip_serializing_if = "Option::is_none")]
845    pub created: Option<String>,
846    #[serde(skip_serializing_if = "Option::is_none")]
847    pub html_url: Option<String>,
848    #[serde(skip_serializing_if = "Option::is_none")]
849    pub sha: Option<String>,
850    #[serde(skip_serializing_if = "Option::is_none")]
851    pub url: Option<String>,
852}
853
854#[derive(Debug, Clone, Serialize, Deserialize)]
855pub struct Branch {
856    /// Информация о последнем коммите в ветке
857    pub commit: CommitMeta,
858    /// Имя ветки
859    pub name: String,
860    /// Является ли ветка защищенной
861    pub protected: bool,
862}
863
864#[derive(Debug, Clone, Serialize, Deserialize)]
865pub struct Permissions {
866    #[serde(skip_serializing_if = "Option::is_none")]
867    pub admin: Option<bool>,
868    #[serde(skip_serializing_if = "Option::is_none")]
869    pub pull: Option<bool>,
870    #[serde(skip_serializing_if = "Option::is_none")]
871    pub push: Option<bool>,
872}
873
874#[derive(Debug, Clone, Serialize, Deserialize)]
875pub struct Collaborator {
876    /// Ссылка на аватар
877    pub avatar_url: String,
878    /// О себе
879    #[serde(skip_serializing_if = "Option::is_none")]
880    pub bio: Option<String>,
881    /// Почта
882    #[serde(skip_serializing_if = "Option::is_none")]
883    pub email: Option<String>,
884    /// Url для получения подписчиков пользователя
885    #[serde(skip_serializing_if = "Option::is_none")]
886    pub followers_url: Option<String>,
887    /// Url для получения подписок пользователя
888    #[serde(skip_serializing_if = "Option::is_none")]
889    pub following_url: Option<String>,
890    /// Полное имя
891    #[serde(skip_serializing_if = "Option::is_none")]
892    pub full_name: Option<String>,
893    /// Ссылка на профиль в веб-интерфейсе
894    pub html_url: String,
895    /// Уникальный идентификатор
896    pub id: f64,
897    /// Логин пользователя
898    pub login: String,
899    /// Имя пользователя
900    #[serde(skip_serializing_if = "Option::is_none")]
901    pub name: Option<String>,
902    /// Url для получения организаций пользователя
903    #[serde(skip_serializing_if = "Option::is_none")]
904    pub organizations_url: Option<String>,
905    /// Права доступа к репозиторию
906    pub permissions: Permissions,
907    /// Url для получения репозиториев пользователя
908    #[serde(skip_serializing_if = "Option::is_none")]
909    pub repos_url: Option<String>,
910    /// Является ли пользователь администратором платформы
911    pub site_admin: bool,
912    /// Url для получения репозиториев пользователя, которые были добавлены в избранное
913    #[serde(skip_serializing_if = "Option::is_none")]
914    pub starred_url: Option<String>,
915    /// Url для получения подписок пользователя
916    #[serde(skip_serializing_if = "Option::is_none")]
917    pub subscriptions_url: Option<String>,
918    /// Тип аккаунта (User или Organization)
919    pub r#type: String,
920    /// Url для получения пользователя
921    #[serde(skip_serializing_if = "Option::is_none")]
922    pub url: Option<String>,
923    /// Вебсайт
924    #[serde(skip_serializing_if = "Option::is_none")]
925    pub website: Option<String>,
926}
927
928#[derive(Debug, Clone, Serialize, Deserialize)]
929pub struct RepoPublicInfo {
930    #[serde(skip_serializing_if = "Option::is_none")]
931    pub contents_url: Option<String>,
932    #[serde(skip_serializing_if = "Option::is_none")]
933    pub description: Option<String>,
934    #[serde(skip_serializing_if = "Option::is_none")]
935    pub fork: Option<bool>,
936    #[serde(skip_serializing_if = "Option::is_none")]
937    pub forks_url: Option<String>,
938    #[serde(skip_serializing_if = "Option::is_none")]
939    pub full_name: Option<String>,
940    #[serde(skip_serializing_if = "Option::is_none")]
941    pub html_url: Option<String>,
942    #[serde(skip_serializing_if = "Option::is_none")]
943    pub id: Option<f64>,
944    #[serde(skip_serializing_if = "Option::is_none")]
945    pub issue_comment_url: Option<String>,
946    #[serde(skip_serializing_if = "Option::is_none")]
947    pub issues_url: Option<String>,
948    #[serde(skip_serializing_if = "Option::is_none")]
949    pub languages_url: Option<String>,
950    #[serde(skip_serializing_if = "Option::is_none")]
951    pub name: Option<String>,
952    #[serde(skip_serializing_if = "Option::is_none")]
953    pub owner: Option<UserPublicInfo>,
954    #[serde(skip_serializing_if = "Option::is_none")]
955    pub private: Option<bool>,
956    #[serde(skip_serializing_if = "Option::is_none")]
957    pub pulls_url: Option<String>,
958    #[serde(skip_serializing_if = "Option::is_none")]
959    pub url: Option<String>,
960}
961
962#[derive(Debug, Clone, Serialize, Deserialize)]
963pub struct CollaboratorInvitation {
964    #[serde(skip_serializing_if = "Option::is_none")]
965    pub created_at: Option<String>,
966    #[serde(skip_serializing_if = "Option::is_none")]
967    pub id: Option<f64>,
968    #[serde(skip_serializing_if = "Option::is_none")]
969    pub invitee: Option<UserPublicInfo>,
970    #[serde(skip_serializing_if = "Option::is_none")]
971    pub inviter: Option<UserPublicInfo>,
972    #[serde(skip_serializing_if = "Option::is_none")]
973    pub permissions: Option<String>,
974    #[serde(skip_serializing_if = "Option::is_none")]
975    pub repository: Option<RepoPublicInfo>,
976}
977
978#[derive(Debug, Clone, Serialize, Deserialize)]
979pub struct Comment {
980    /// Роль автора относительно репозитория: OWNER, MEMBER, CONTRIBUTOR, NONE
981    pub author_association: String,
982    /// Текст комментария
983    pub body: String,
984    /// Дата создания (ISO 8601)
985    pub created_at: String,
986    /// Ссылка на комментарий в веб-интерфейсе
987    pub html_url: String,
988    /// Уникальный идентификатор комментария
989    pub id: f64,
990    /// Ссылка на задачу или пул-реквест
991    pub issue_url: String,
992    /// Дата последнего изменения (ISO 8601)
993    pub updated_at: String,
994    /// Url для получения пользователя
995    #[serde(skip_serializing_if = "Option::is_none")]
996    pub url: Option<String>,
997    /// Информация об авторе комментария
998    pub user: UserPublicInfo,
999}
1000
1001#[derive(Debug, Clone, Serialize, Deserialize)]
1002pub struct CommitFiles {
1003    #[serde(skip_serializing_if = "Option::is_none")]
1004    pub additions: Option<f64>,
1005    #[serde(skip_serializing_if = "Option::is_none")]
1006    pub blob_url: Option<String>,
1007    #[serde(skip_serializing_if = "Option::is_none")]
1008    pub changes: Option<f64>,
1009    #[serde(skip_serializing_if = "Option::is_none")]
1010    pub contents_url: Option<String>,
1011    #[serde(skip_serializing_if = "Option::is_none")]
1012    pub deletions: Option<f64>,
1013    #[serde(skip_serializing_if = "Option::is_none")]
1014    pub filename: Option<String>,
1015    #[serde(skip_serializing_if = "Option::is_none")]
1016    pub patch: Option<String>,
1017    #[serde(skip_serializing_if = "Option::is_none")]
1018    pub raw_url: Option<String>,
1019    #[serde(skip_serializing_if = "Option::is_none")]
1020    pub sha: Option<String>,
1021    #[serde(skip_serializing_if = "Option::is_none")]
1022    pub status: Option<String>,
1023}
1024
1025#[derive(Debug, Clone, Serialize, Deserialize)]
1026pub struct CommitUser {
1027    #[serde(skip_serializing_if = "Option::is_none")]
1028    pub date: Option<String>,
1029    #[serde(skip_serializing_if = "Option::is_none")]
1030    pub email: Option<String>,
1031    #[serde(skip_serializing_if = "Option::is_none")]
1032    pub name: Option<String>,
1033}
1034
1035#[derive(Debug, Clone, Serialize, Deserialize)]
1036pub struct TreeMeta {
1037    #[serde(skip_serializing_if = "Option::is_none")]
1038    pub created: Option<String>,
1039    #[serde(skip_serializing_if = "Option::is_none")]
1040    pub sha: Option<String>,
1041    #[serde(skip_serializing_if = "Option::is_none")]
1042    pub url: Option<String>,
1043}
1044
1045#[derive(Debug, Clone, Serialize, Deserialize)]
1046pub struct RepoCommit {
1047    /// Нет
1048    pub author: CommitUser,
1049    /// Нет
1050    pub committer: CommitUser,
1051    /// Да
1052    pub message: String,
1053    /// Да
1054    pub tree: TreeMeta,
1055    #[serde(skip_serializing_if = "Option::is_none")]
1056    pub url: Option<String>,
1057}
1058
1059#[derive(Debug, Clone, Serialize, Deserialize)]
1060pub struct CommitStats {
1061    #[serde(skip_serializing_if = "Option::is_none")]
1062    pub additions: Option<f64>,
1063    #[serde(skip_serializing_if = "Option::is_none")]
1064    pub deletions: Option<f64>,
1065    #[serde(skip_serializing_if = "Option::is_none")]
1066    pub total: Option<f64>,
1067}
1068
1069#[derive(Debug, Clone, Serialize, Deserialize)]
1070pub struct Commit {
1071    #[serde(skip_serializing_if = "Option::is_none")]
1072    pub author: Option<UserPublicInfo>,
1073    #[serde(skip_serializing_if = "Option::is_none")]
1074    pub branch: Option<String>,
1075    #[serde(skip_serializing_if = "Option::is_none")]
1076    pub commit: Option<RepoCommit>,
1077    #[serde(skip_serializing_if = "Option::is_none")]
1078    pub committer: Option<UserPublicInfo>,
1079    #[serde(skip_serializing_if = "Option::is_none")]
1080    pub created: Option<String>,
1081    #[serde(skip_serializing_if = "Option::is_none")]
1082    pub files: Option<Vec<CommitFiles>>,
1083    #[serde(skip_serializing_if = "Option::is_none")]
1084    pub html_url: Option<String>,
1085    #[serde(skip_serializing_if = "Option::is_none")]
1086    pub parents: Option<Vec<CommitMeta>>,
1087    /// Хеш коммита (обязательный)
1088    pub sha: String,
1089    #[serde(skip_serializing_if = "Option::is_none")]
1090    pub stats: Option<CommitStats>,
1091    #[serde(skip_serializing_if = "Option::is_none")]
1092    pub url: Option<String>,
1093}
1094
1095#[derive(Debug, Clone, Serialize, Deserialize)]
1096pub struct CommitVerification {
1097    #[serde(skip_serializing_if = "Option::is_none")]
1098    pub payload: Option<String>,
1099    #[serde(skip_serializing_if = "Option::is_none")]
1100    pub reason: Option<String>,
1101    #[serde(skip_serializing_if = "Option::is_none")]
1102    pub signature: Option<String>,
1103    #[serde(skip_serializing_if = "Option::is_none")]
1104    pub verified: Option<bool>,
1105    #[serde(rename = "verifiedAt")]
1106    #[serde(skip_serializing_if = "Option::is_none")]
1107    pub verified_at: Option<String>,
1108}
1109
1110#[derive(Debug, Clone, Serialize, Deserialize)]
1111pub struct CompareResponse {
1112    #[serde(skip_serializing_if = "Option::is_none")]
1113    pub ahead_by: Option<f64>,
1114    #[serde(skip_serializing_if = "Option::is_none")]
1115    pub base_commit: Option<Commit>,
1116    #[serde(skip_serializing_if = "Option::is_none")]
1117    pub behind_by: Option<f64>,
1118    #[serde(skip_serializing_if = "Option::is_none")]
1119    pub commits: Option<Vec<Commit>>,
1120    #[serde(skip_serializing_if = "Option::is_none")]
1121    pub files: Option<Vec<CommitFiles>>,
1122    #[serde(skip_serializing_if = "Option::is_none")]
1123    pub html_url: Option<String>,
1124    #[serde(skip_serializing_if = "Option::is_none")]
1125    pub merge_base_commit: Option<Commit>,
1126    #[serde(skip_serializing_if = "Option::is_none")]
1127    pub status: Option<String>,
1128    #[serde(skip_serializing_if = "Option::is_none")]
1129    pub total_commits: Option<f64>,
1130    #[serde(skip_serializing_if = "Option::is_none")]
1131    pub url: Option<String>,
1132}
1133
1134#[derive(Debug, Clone, Serialize, Deserialize)]
1135pub struct WebhookConfig {
1136    #[serde(skip_serializing_if = "Option::is_none")]
1137    pub authorization_header: Option<String>,
1138    #[serde(skip_serializing_if = "Option::is_none")]
1139    pub branch_filter: Option<String>,
1140    #[serde(skip_serializing_if = "Option::is_none")]
1141    pub content_type: Option<String>,
1142    #[serde(skip_serializing_if = "Option::is_none")]
1143    pub http_method: Option<String>,
1144    #[serde(skip_serializing_if = "Option::is_none")]
1145    pub url: Option<String>,
1146}
1147
1148#[derive(Debug, Clone, Serialize, Deserialize)]
1149pub struct FileLinksResponse {
1150    #[serde(skip_serializing_if = "Option::is_none")]
1151    pub git: Option<String>,
1152    #[serde(skip_serializing_if = "Option::is_none")]
1153    pub html: Option<String>,
1154    #[serde(skip_serializing_if = "Option::is_none")]
1155    pub self_: Option<String>,
1156}
1157
1158#[derive(Debug, Clone, Serialize, Deserialize)]
1159pub struct ContentsResponse {
1160    /// Объект со ссылками: self, git, html
1161    #[serde(rename = "_links")]
1162    pub links: FileLinksResponse,
1163    /// Содержимое файла в Base64 (только для type: "file")
1164    #[serde(skip_serializing_if = "Option::is_none")]
1165    pub content: Option<String>,
1166    /// Прямая ссылка для скачивания (null для директорий)
1167    #[serde(skip_serializing_if = "Option::is_none")]
1168    pub download_url: Option<String>,
1169    /// Кодировка содержимого (base64 для файлов)
1170    pub encoding: String,
1171    /// Ссылка на Git-объект (blob/tree)
1172    pub git_url: String,
1173    /// Ссылка на веб-интерфейс
1174    pub html_url: String,
1175    /// Язык программирования (если применимо)
1176    #[serde(skip_serializing_if = "Option::is_none")]
1177    pub language: Option<String>,
1178    /// Имя файла или папки
1179    pub name: String,
1180    /// Полный путь от корня репозитория
1181    pub path: String,
1182    /// SHA-хеш объекта Git
1183    pub sha: String,
1184    /// Размер в байтах (для директорий — 0)
1185    pub size: f64,
1186    /// `submodule_git_url` is populated when `type` is `submodule`, otherwise null
1187    #[serde(skip_serializing_if = "Option::is_none")]
1188    pub submodule_git_url: Option<String>,
1189    /// `target` is populated when `type` is `symlink`, otherwise null
1190    #[serde(skip_serializing_if = "Option::is_none")]
1191    pub target: Option<String>,
1192    /// Тип: "file", "dir", "symlink" или "submodule"
1193    pub r#type: String,
1194    /// API-ссылка на этот объект
1195    pub url: String,
1196}
1197
1198#[derive(Debug, Clone, Serialize, Deserialize)]
1199pub struct FileCommitResponse {
1200    #[serde(skip_serializing_if = "Option::is_none")]
1201    pub author: Option<CommitUser>,
1202    #[serde(skip_serializing_if = "Option::is_none")]
1203    pub committer: Option<CommitUser>,
1204    #[serde(skip_serializing_if = "Option::is_none")]
1205    pub created: Option<String>,
1206    #[serde(skip_serializing_if = "Option::is_none")]
1207    pub html_url: Option<String>,
1208    #[serde(skip_serializing_if = "Option::is_none")]
1209    pub message: Option<String>,
1210    #[serde(skip_serializing_if = "Option::is_none")]
1211    pub parents: Option<Vec<CommitMeta>>,
1212    #[serde(skip_serializing_if = "Option::is_none")]
1213    pub sha: Option<String>,
1214    #[serde(skip_serializing_if = "Option::is_none")]
1215    pub tree: Option<CommitMeta>,
1216    #[serde(skip_serializing_if = "Option::is_none")]
1217    pub url: Option<String>,
1218    #[serde(skip_serializing_if = "Option::is_none")]
1219    pub verification: Option<CommitVerification>,
1220}
1221
1222#[derive(Debug, Clone, Serialize, Deserialize)]
1223pub struct FileCreationResponse {
1224    #[serde(skip_serializing_if = "Option::is_none")]
1225    pub commit: Option<FileCommitResponse>,
1226    /// Да
1227    pub content: ContentsResponse,
1228}
1229
1230#[derive(Debug, Clone, Serialize, Deserialize)]
1231pub struct FileDeleteResponse {
1232    #[serde(skip_serializing_if = "Option::is_none")]
1233    pub commit: Option<FileCommitResponse>,
1234    #[serde(skip_serializing_if = "Option::is_none")]
1235    pub content: Option<serde_json::Value>,
1236}
1237
1238#[derive(Debug, Clone, Serialize, Deserialize)]
1239pub struct Email {
1240    /// Email-адрес
1241    pub email: String,
1242    /// Является ли основным адресом аккаунта
1243    pub primary: bool,
1244    /// Подтвержден ли адрес (через email-верификацию)
1245    pub verified: bool,
1246    /// Видимость: public или private
1247    pub visibility: String,
1248}
1249
1250#[derive(Debug, Clone, Serialize, Deserialize)]
1251pub struct GitEntry {
1252    #[serde(skip_serializing_if = "Option::is_none")]
1253    pub mode: Option<String>,
1254    #[serde(skip_serializing_if = "Option::is_none")]
1255    pub path: Option<String>,
1256    #[serde(skip_serializing_if = "Option::is_none")]
1257    pub sha: Option<String>,
1258    #[serde(skip_serializing_if = "Option::is_none")]
1259    pub size: Option<f64>,
1260    #[serde(skip_serializing_if = "Option::is_none")]
1261    pub r#type: Option<String>,
1262    #[serde(skip_serializing_if = "Option::is_none")]
1263    pub url: Option<String>,
1264}
1265
1266#[derive(Debug, Clone, Serialize, Deserialize)]
1267pub struct GitObject {
1268    #[serde(skip_serializing_if = "Option::is_none")]
1269    pub sha: Option<String>,
1270    #[serde(skip_serializing_if = "Option::is_none")]
1271    pub r#type: Option<String>,
1272    #[serde(skip_serializing_if = "Option::is_none")]
1273    pub url: Option<String>,
1274}
1275
1276#[derive(Debug, Clone, Serialize, Deserialize)]
1277pub struct GitTreeResponse {
1278    /// Текущая страница пагинации
1279    pub page: f64,
1280    /// SHA-хеш запрошенного дерева
1281    pub sha: String,
1282    /// Общее количество элементов в дереве
1283    pub total_count: f64,
1284    /// Список элементов (файлов и папок)
1285    #[serde(default, deserialize_with = "crate::deserialize_null_as_default")]
1286    pub tree: Vec<GitEntry>,
1287    /// Был ли результат обрезан из-за ограничений (например, слишком большое дерево)
1288    pub truncated: bool,
1289    /// API-ссылка на это дерево
1290    pub url: String,
1291}
1292
1293#[derive(Debug, Clone, Serialize, Deserialize)]
1294pub struct User {
1295    /// Адрес аватарки
1296    #[serde(skip_serializing_if = "Option::is_none")]
1297    pub avatar_url: Option<String>,
1298    /// О себе
1299    #[serde(skip_serializing_if = "Option::is_none")]
1300    pub bio: Option<String>,
1301    /// Дата создания учетной записи
1302    #[serde(skip_serializing_if = "Option::is_none")]
1303    pub created_at: Option<String>,
1304    /// Почта
1305    #[serde(skip_serializing_if = "Option::is_none")]
1306    pub email: Option<String>,
1307    /// Счетчики
1308    #[serde(skip_serializing_if = "Option::is_none")]
1309    pub followers: Option<f64>,
1310    /// Url для получения подписчиков пользователя
1311    #[serde(skip_serializing_if = "Option::is_none")]
1312    pub followers_url: Option<String>,
1313    #[serde(skip_serializing_if = "Option::is_none")]
1314    pub following: Option<f64>,
1315    /// Url для получения подписок пользователя
1316    #[serde(skip_serializing_if = "Option::is_none")]
1317    pub following_url: Option<String>,
1318    /// Полное имя
1319    #[serde(skip_serializing_if = "Option::is_none")]
1320    pub full_name: Option<String>,
1321    /// Адрес страницы пользователя
1322    #[serde(skip_serializing_if = "Option::is_none")]
1323    pub html_url: Option<String>,
1324    /// Идентификатор
1325    #[serde(skip_serializing_if = "Option::is_none")]
1326    pub id: Option<f64>,
1327    /// Верифицирован?
1328    #[serde(skip_serializing_if = "Option::is_none")]
1329    pub is_verified: Option<bool>,
1330    /// Местоположение
1331    #[serde(skip_serializing_if = "Option::is_none")]
1332    pub location: Option<String>,
1333    /// Логин пользователя
1334    #[serde(skip_serializing_if = "Option::is_none")]
1335    pub login: Option<String>,
1336    /// Имя пользователя
1337    #[serde(skip_serializing_if = "Option::is_none")]
1338    pub name: Option<String>,
1339    /// Url для получения организаций пользователя
1340    #[serde(skip_serializing_if = "Option::is_none")]
1341    pub organizations_url: Option<String>,
1342    /// Публичные репозитории
1343    #[serde(skip_serializing_if = "Option::is_none")]
1344    pub public_repos: Option<f64>,
1345    /// Url для получения репозиториев пользователя
1346    #[serde(skip_serializing_if = "Option::is_none")]
1347    pub repos_url: Option<String>,
1348    /// Есть ли права админа
1349    #[serde(skip_serializing_if = "Option::is_none")]
1350    pub site_admin: Option<bool>,
1351    /// Url для получения репозиториев пользователя, которые были добавлены в избранное
1352    #[serde(skip_serializing_if = "Option::is_none")]
1353    pub starred_url: Option<String>,
1354    /// Количество репозиториев в избранном
1355    #[serde(skip_serializing_if = "Option::is_none")]
1356    pub stars_count: Option<f64>,
1357    /// Url для получения подписок пользователя
1358    #[serde(skip_serializing_if = "Option::is_none")]
1359    pub subscriptions_url: Option<String>,
1360    /// Тип пользователя
1361    #[serde(skip_serializing_if = "Option::is_none")]
1362    pub r#type: Option<String>,
1363    /// Дата изменения учетной записи
1364    #[serde(skip_serializing_if = "Option::is_none")]
1365    pub updated_at: Option<String>,
1366    /// Url для получения пользователя
1367    #[serde(skip_serializing_if = "Option::is_none")]
1368    pub url: Option<String>,
1369    /// Вебсайт
1370    #[serde(skip_serializing_if = "Option::is_none")]
1371    pub website: Option<String>,
1372}
1373
1374#[derive(Debug, Clone, Serialize, Deserialize)]
1375pub struct Label {
1376    /// Цвет метки в формате HEX (без #)
1377    pub color: String,
1378    /// Описание метки
1379    pub description: String,
1380    /// Является ли метка исключающей (только одна из группы)
1381    pub exclusive: bool,
1382    /// Уникальный идентификатор метки
1383    pub id: f64,
1384    /// Архивирована ли метка
1385    pub is_archived: bool,
1386    /// Название метки
1387    pub name: String,
1388    /// Ссылка на метку в API
1389    pub url: String,
1390}
1391
1392#[derive(Debug, Clone, Serialize, Deserialize)]
1393pub struct Milestone {
1394    #[serde(skip_serializing_if = "Option::is_none")]
1395    pub closed_at: Option<String>,
1396    #[serde(skip_serializing_if = "Option::is_none")]
1397    pub closed_issues: Option<f64>,
1398    #[serde(skip_serializing_if = "Option::is_none")]
1399    pub created_at: Option<String>,
1400    #[serde(skip_serializing_if = "Option::is_none")]
1401    pub description: Option<String>,
1402    #[serde(skip_serializing_if = "Option::is_none")]
1403    pub due_on: Option<String>,
1404    #[serde(skip_serializing_if = "Option::is_none")]
1405    pub id: Option<f64>,
1406    #[serde(skip_serializing_if = "Option::is_none")]
1407    pub open_issues: Option<f64>,
1408    #[serde(skip_serializing_if = "Option::is_none")]
1409    pub state: Option<String>,
1410    #[serde(skip_serializing_if = "Option::is_none")]
1411    pub title: Option<String>,
1412    #[serde(skip_serializing_if = "Option::is_none")]
1413    pub updated_at: Option<String>,
1414}
1415
1416#[derive(Debug, Clone, Serialize, Deserialize)]
1417pub struct PullRequestMeta {
1418    #[serde(skip_serializing_if = "Option::is_none")]
1419    pub draft: Option<bool>,
1420    #[serde(skip_serializing_if = "Option::is_none")]
1421    pub html_url: Option<String>,
1422    #[serde(skip_serializing_if = "Option::is_none")]
1423    pub merged: Option<bool>,
1424    #[serde(skip_serializing_if = "Option::is_none")]
1425    pub merged_at: Option<String>,
1426}
1427
1428#[derive(Debug, Clone, Serialize, Deserialize)]
1429pub struct RepositoryMeta {
1430    #[serde(skip_serializing_if = "Option::is_none")]
1431    pub full_name: Option<String>,
1432    #[serde(skip_serializing_if = "Option::is_none")]
1433    pub id: Option<f64>,
1434    #[serde(skip_serializing_if = "Option::is_none")]
1435    pub name: Option<String>,
1436    #[serde(skip_serializing_if = "Option::is_none")]
1437    pub owner: Option<String>,
1438}
1439
1440#[derive(Debug, Clone, Serialize, Deserialize)]
1441pub struct Issue {
1442    #[serde(skip_serializing_if = "Option::is_none")]
1443    pub assets: Option<Vec<Attachment>>,
1444    #[serde(skip_serializing_if = "Option::is_none")]
1445    pub assignee: Option<User>,
1446    /// Список назначенных пользователей
1447    #[serde(default, deserialize_with = "crate::deserialize_null_as_default")]
1448    pub assignees: Vec<User>,
1449    /// Описание
1450    pub body: String,
1451    /// Дата закрытия (если закрыта)
1452    #[serde(skip_serializing_if = "Option::is_none")]
1453    pub closed_at: Option<String>,
1454    /// Количество комментариев
1455    pub comments: f64,
1456    /// Дата создания (ISO 8601)
1457    pub created_at: String,
1458    #[serde(skip_serializing_if = "Option::is_none")]
1459    pub due_date: Option<String>,
1460    /// Ссылка на задачу в веб-интерфейсе
1461    pub html_url: String,
1462    /// Внутренний ID задачи
1463    pub id: f64,
1464    #[serde(skip_serializing_if = "Option::is_none")]
1465    pub is_locked: Option<bool>,
1466    /// Список меток
1467    #[serde(default, deserialize_with = "crate::deserialize_null_as_default")]
1468    pub labels: Vec<Label>,
1469    /// Веха (milestone)
1470    #[serde(skip_serializing_if = "Option::is_none")]
1471    pub milestone: Option<Milestone>,
1472    /// Публичный индекс задачи/PR в репозитории
1473    pub number: f64,
1474    #[serde(skip_serializing_if = "Option::is_none")]
1475    pub original_author: Option<String>,
1476    #[serde(skip_serializing_if = "Option::is_none")]
1477    pub original_author_id: Option<f64>,
1478    /// Присутствует только для пул-реквестов
1479    #[serde(skip_serializing_if = "Option::is_none")]
1480    pub pull_request: Option<PullRequestMeta>,
1481    #[serde(skip_serializing_if = "Option::is_none")]
1482    pub r#ref: Option<String>,
1483    #[serde(skip_serializing_if = "Option::is_none")]
1484    pub repository: Option<RepositoryMeta>,
1485    /// Состояние: open, closed
1486    pub state: String,
1487    /// Заголовок
1488    pub title: String,
1489    /// Дата последнего изменения
1490    pub updated_at: String,
1491    #[serde(skip_serializing_if = "Option::is_none")]
1492    pub url: Option<String>,
1493    /// Автор задачи
1494    pub user: User,
1495}
1496
1497#[derive(Debug, Clone, Serialize, Deserialize)]
1498pub struct JobsResponse {
1499    #[serde(skip_serializing_if = "Option::is_none")]
1500    pub jobs: Option<Vec<ActionRunJob>>,
1501    #[serde(skip_serializing_if = "Option::is_none")]
1502    pub total_count: Option<f64>,
1503}
1504
1505#[derive(Debug, Clone, Serialize, Deserialize)]
1506pub struct Repository {
1507    /// Разрешено ли создание merge-коммитов
1508    pub allow_merge_commit: bool,
1509    /// Разрешено ли rebase-слияние
1510    pub allow_rebase_merge: bool,
1511    /// Разрешено ли squash-слияние
1512    pub allow_squash_merge: bool,
1513    /// Архивирован ли репозиторий
1514    pub archived: bool,
1515    /// Ссылка для клонирования по HTTPS
1516    pub clone_url: String,
1517    #[serde(skip_serializing_if = "Option::is_none")]
1518    pub contents_url: Option<String>,
1519    /// Дата и время создания (ISO 8601)
1520    pub created_at: String,
1521    /// Имя основной ветки
1522    pub default_branch: String,
1523    /// Удалять ли ветку после слияния
1524    pub delete_branch_on_merge: bool,
1525    /// Описание репозитория
1526    #[serde(skip_serializing_if = "Option::is_none")]
1527    pub description: Option<String>,
1528    /// Отключен ли репозиторий
1529    pub disabled: bool,
1530    /// Является ли репозиторий форком
1531    pub fork: bool,
1532    #[serde(skip_serializing_if = "Option::is_none")]
1533    pub forks: Option<f64>,
1534    /// Количество форков
1535    pub forks_count: f64,
1536    #[serde(skip_serializing_if = "Option::is_none")]
1537    pub forks_url: Option<String>,
1538    /// Полное имя репозитория (owner/repo)
1539    pub full_name: String,
1540    /// Включены ли задачи (issues)
1541    pub has_issues: bool,
1542    /// Включена ли вики
1543    pub has_wiki: bool,
1544    /// Ссылка на страницу репозитория в веб-интерфейсе
1545    pub html_url: String,
1546    /// Уникальный числовой идентификатор репозитория
1547    pub id: f64,
1548    /// Является ли репозиторий шаблоном
1549    pub is_template: bool,
1550    #[serde(skip_serializing_if = "Option::is_none")]
1551    pub issue_comment_url: Option<String>,
1552    #[serde(skip_serializing_if = "Option::is_none")]
1553    pub issues_url: Option<String>,
1554    /// Основной язык программирования
1555    #[serde(skip_serializing_if = "Option::is_none")]
1556    pub language: Option<String>,
1557    #[serde(skip_serializing_if = "Option::is_none")]
1558    pub languages_url: Option<String>,
1559    #[serde(skip_serializing_if = "Option::is_none")]
1560    pub mirror_url: Option<String>,
1561    /// Название репозитория
1562    pub name: String,
1563    #[serde(skip_serializing_if = "Option::is_none")]
1564    pub open_issues: Option<f64>,
1565    /// Количество открытых задач и PR
1566    pub open_issues_count: f64,
1567    /// Информация о владельце: login (строка), id (целое число), avatar_url (строка)
1568    pub owner: UserPublicInfo,
1569    #[serde(skip_serializing_if = "Option::is_none")]
1570    pub parent: Option<Box<Repository>>,
1571    /// Права текущего пользователя: admin, push, pull (все — boolean)
1572    pub permissions: Permissions,
1573    /// Признак приватности: true — приватный, false — публичный
1574    pub private: bool,
1575    #[serde(skip_serializing_if = "Option::is_none")]
1576    pub pulls_url: Option<String>,
1577    /// Дата последнего пуша
1578    pub pushed_at: String,
1579    /// Размер репозитория в килобайтах
1580    pub size: f64,
1581    /// Ссылка для клонирования по SSH
1582    pub ssh_url: String,
1583    /// Количество пользователей, поставивших «звезду»
1584    pub stargazers_count: f64,
1585    #[serde(skip_serializing_if = "Option::is_none")]
1586    pub template_repository: Option<Box<Repository>>,
1587    /// Список тем (тегов) репозитория
1588    #[serde(default, deserialize_with = "crate::deserialize_null_as_default")]
1589    pub topics: Vec<String>,
1590    /// Дата последнего обновления метаданных
1591    pub updated_at: String,
1592    #[serde(skip_serializing_if = "Option::is_none")]
1593    pub url: Option<String>,
1594    /// Видимость: public, private или internal
1595    pub visibility: String,
1596    #[serde(skip_serializing_if = "Option::is_none")]
1597    pub watchers: Option<f64>,
1598    /// Количество наблюдателей
1599    pub watchers_count: f64,
1600}
1601
1602#[derive(Debug, Clone, Serialize, Deserialize)]
1603pub struct PRBranchInfo {
1604    #[serde(skip_serializing_if = "Option::is_none")]
1605    pub label: Option<String>,
1606    #[serde(skip_serializing_if = "Option::is_none")]
1607    pub r#ref: Option<String>,
1608    #[serde(skip_serializing_if = "Option::is_none")]
1609    pub repo: Option<Repository>,
1610    #[serde(skip_serializing_if = "Option::is_none")]
1611    pub repo_id: Option<f64>,
1612    #[serde(skip_serializing_if = "Option::is_none")]
1613    pub sha: Option<String>,
1614}
1615
1616#[derive(Debug, Clone, Serialize, Deserialize)]
1617pub struct PackageVersionMetadata {
1618    #[serde(skip_serializing_if = "Option::is_none")]
1619    pub package_type: Option<String>,
1620}
1621
1622#[derive(Debug, Clone, Serialize, Deserialize)]
1623pub struct PackageVersion {
1624    #[serde(skip_serializing_if = "Option::is_none")]
1625    pub created_at: Option<String>,
1626    #[serde(skip_serializing_if = "Option::is_none")]
1627    pub description: Option<String>,
1628    #[serde(skip_serializing_if = "Option::is_none")]
1629    pub html_url: Option<String>,
1630    #[serde(skip_serializing_if = "Option::is_none")]
1631    pub id: Option<f64>,
1632    #[serde(skip_serializing_if = "Option::is_none")]
1633    pub license: Option<String>,
1634    #[serde(skip_serializing_if = "Option::is_none")]
1635    pub metadata: Option<PackageVersionMetadata>,
1636    #[serde(skip_serializing_if = "Option::is_none")]
1637    pub name: Option<String>,
1638    #[serde(skip_serializing_if = "Option::is_none")]
1639    pub package_html_url: Option<String>,
1640    #[serde(skip_serializing_if = "Option::is_none")]
1641    pub url: Option<String>,
1642}
1643
1644#[derive(Debug, Clone, Serialize, Deserialize)]
1645pub struct PagesDeployment {
1646    #[serde(skip_serializing_if = "Option::is_none")]
1647    pub id: Option<f64>,
1648    #[serde(skip_serializing_if = "Option::is_none")]
1649    pub page_url: Option<String>,
1650    #[serde(skip_serializing_if = "Option::is_none")]
1651    pub status_url: Option<String>,
1652}
1653
1654#[derive(Debug, Clone, Serialize, Deserialize)]
1655pub struct PagesDeploymentStatus {
1656    #[serde(skip_serializing_if = "Option::is_none")]
1657    pub status: Option<String>,
1658}
1659
1660#[derive(Debug, Clone, Serialize, Deserialize)]
1661pub struct Team {
1662    /// Полномочия на создание репозиториев
1663    #[serde(skip_serializing_if = "Option::is_none")]
1664    pub can_create_org_repo: Option<bool>,
1665    /// Описание команды (может быть null)
1666    #[serde(skip_serializing_if = "Option::is_none")]
1667    pub description: Option<String>,
1668    /// Уникальный идентификатор команды
1669    pub id: f64,
1670    /// Включает все репозитории
1671    #[serde(skip_serializing_if = "Option::is_none")]
1672    pub includes_all_repositories: Option<bool>,
1673    /// Название команды
1674    pub name: String,
1675    /// Количество участников
1676    #[serde(skip_serializing_if = "Option::is_none")]
1677    pub num_members: Option<f64>,
1678    /// Количество репозиториев
1679    #[serde(skip_serializing_if = "Option::is_none")]
1680    pub num_repos: Option<f64>,
1681    /// Общий уровень доступа: none, read, write, admin, owner
1682    pub permission: String,
1683    /// Полномочие на действия с ветками
1684    #[serde(skip_serializing_if = "Option::is_none")]
1685    pub permission_actions: Option<String>,
1686    /// Код полномочия
1687    #[serde(skip_serializing_if = "Option::is_none")]
1688    pub permission_code: Option<String>,
1689    /// Полномочие на пакеты
1690    #[serde(skip_serializing_if = "Option::is_none")]
1691    pub permission_packages: Option<String>,
1692    /// Полномочие на отправку пулл-реквестов
1693    #[serde(skip_serializing_if = "Option::is_none")]
1694    pub permission_pulls: Option<String>,
1695    /// Полномочие на релизы
1696    #[serde(skip_serializing_if = "Option::is_none")]
1697    pub permission_releases: Option<String>,
1698}
1699
1700#[derive(Debug, Clone, Serialize, Deserialize)]
1701pub struct PullRequest {
1702    #[serde(skip_serializing_if = "Option::is_none")]
1703    pub assignee: Option<User>,
1704    /// Назначенные участники
1705    #[serde(default, deserialize_with = "crate::deserialize_null_as_default")]
1706    pub assignees: Vec<User>,
1707    /// Целевая ветка и репозиторий
1708    pub base: PRBranchInfo,
1709    /// Описание (тело) PR
1710    pub body: String,
1711    /// Дата закрытия (если закрыт)
1712    #[serde(skip_serializing_if = "Option::is_none")]
1713    pub closed_at: Option<String>,
1714    /// Количество комментариев
1715    pub comments: f64,
1716    /// Дата создания (RFC3339)
1717    pub created_at: String,
1718    #[serde(skip_serializing_if = "Option::is_none")]
1719    pub diff_url: Option<String>,
1720    /// Исходная ветка и репозиторий
1721    pub head: PRBranchInfo,
1722    /// Ссылка на PR в веб-интерфейсе
1723    pub html_url: String,
1724    /// Уникальный идентификатор pull request
1725    pub id: f64,
1726    /// Является ли черновиком
1727    pub is_draft: bool,
1728    /// Метки
1729    #[serde(default, deserialize_with = "crate::deserialize_null_as_default")]
1730    pub labels: Vec<Label>,
1731    /// Заблокирован ли от комментариев
1732    pub locked: bool,
1733    /// Могут ли мейнтейнеры изменять ветку автора
1734    pub maintainer_can_modify: bool,
1735    /// SHA коммита слияния
1736    #[serde(skip_serializing_if = "Option::is_none")]
1737    pub merge_commit_sha: Option<String>,
1738    /// Можно ли слить без конфликтов
1739    pub mergeable: bool,
1740    /// Был ли PR слит
1741    pub merged: bool,
1742    /// Дата слияния (если слит)
1743    #[serde(skip_serializing_if = "Option::is_none")]
1744    pub merged_at: Option<String>,
1745    #[serde(skip_serializing_if = "Option::is_none")]
1746    pub merged_by: Option<User>,
1747    /// Веха (milestone)
1748    #[serde(skip_serializing_if = "Option::is_none")]
1749    pub milestone: Option<Milestone>,
1750    /// Номер PR в репозитории
1751    pub number: f64,
1752    #[serde(skip_serializing_if = "Option::is_none")]
1753    pub patch_url: Option<String>,
1754    /// Запрошенные ревьюеры
1755    #[serde(default, deserialize_with = "crate::deserialize_null_as_default")]
1756    pub requested_reviewers: Vec<User>,
1757    /// Запрошенные команды
1758    #[serde(default, deserialize_with = "crate::deserialize_null_as_default")]
1759    pub requested_teams: Vec<Team>,
1760    /// Состояние: open, closed
1761    pub state: String,
1762    /// Заголовок PR
1763    pub title: String,
1764    /// Дата последнего обновления
1765    pub updated_at: String,
1766    /// API-ссылка на PR
1767    pub url: String,
1768    /// Автор PR
1769    pub user: User,
1770}
1771
1772#[derive(Debug, Clone, Serialize, Deserialize)]
1773pub struct Reaction {
1774    #[serde(skip_serializing_if = "Option::is_none")]
1775    pub content: Option<String>,
1776    #[serde(skip_serializing_if = "Option::is_none")]
1777    pub created_at: Option<String>,
1778    #[serde(skip_serializing_if = "Option::is_none")]
1779    pub id: Option<f64>,
1780    #[serde(skip_serializing_if = "Option::is_none")]
1781    pub user: Option<UserPublicInfo>,
1782}
1783
1784#[derive(Debug, Clone, Serialize, Deserialize)]
1785pub struct Reference {
1786    #[serde(skip_serializing_if = "Option::is_none")]
1787    pub object: Option<GitObject>,
1788    /// Полный путь к ссылке. Примеры: refs/heads/new-feature, refs/tags/v1.0.
1789    pub r#ref: String,
1790    #[serde(skip_serializing_if = "Option::is_none")]
1791    pub url: Option<String>,
1792}
1793
1794#[derive(Debug, Clone, Serialize, Deserialize)]
1795pub struct RegistrationToken {
1796    #[serde(skip_serializing_if = "Option::is_none")]
1797    pub token: Option<String>,
1798}
1799
1800#[derive(Debug, Clone, Serialize, Deserialize)]
1801pub struct Release {
1802    #[serde(skip_serializing_if = "Option::is_none")]
1803    pub assets: Option<Vec<Attachment>>,
1804    #[serde(skip_serializing_if = "Option::is_none")]
1805    pub author: Option<User>,
1806    #[serde(skip_serializing_if = "Option::is_none")]
1807    pub body: Option<String>,
1808    #[serde(skip_serializing_if = "Option::is_none")]
1809    pub created_at: Option<String>,
1810    #[serde(skip_serializing_if = "Option::is_none")]
1811    pub draft: Option<bool>,
1812    #[serde(skip_serializing_if = "Option::is_none")]
1813    pub html_url: Option<String>,
1814    #[serde(skip_serializing_if = "Option::is_none")]
1815    pub id: Option<f64>,
1816    #[serde(skip_serializing_if = "Option::is_none")]
1817    pub is_authorized_only: Option<bool>,
1818    #[serde(skip_serializing_if = "Option::is_none")]
1819    pub name: Option<String>,
1820    #[serde(skip_serializing_if = "Option::is_none")]
1821    pub prerelease: Option<bool>,
1822    #[serde(skip_serializing_if = "Option::is_none")]
1823    pub published_at: Option<String>,
1824    #[serde(skip_serializing_if = "Option::is_none")]
1825    pub tag_name: Option<String>,
1826    #[serde(skip_serializing_if = "Option::is_none")]
1827    pub tarball_url: Option<String>,
1828    #[serde(skip_serializing_if = "Option::is_none")]
1829    pub target_commitish: Option<String>,
1830    #[serde(skip_serializing_if = "Option::is_none")]
1831    pub upload_url: Option<String>,
1832    #[serde(skip_serializing_if = "Option::is_none")]
1833    pub url: Option<String>,
1834    #[serde(skip_serializing_if = "Option::is_none")]
1835    pub zipball_url: Option<String>,
1836}
1837
1838#[derive(Debug, Clone, Serialize, Deserialize)]
1839pub struct TreeEntry {
1840    #[serde(skip_serializing_if = "Option::is_none")]
1841    pub mode: Option<String>,
1842    #[serde(skip_serializing_if = "Option::is_none")]
1843    pub path: Option<String>,
1844    #[serde(skip_serializing_if = "Option::is_none")]
1845    pub sha: Option<String>,
1846    #[serde(skip_serializing_if = "Option::is_none")]
1847    pub size: Option<f64>,
1848    /// "blob", "tree", "commit"
1849    #[serde(skip_serializing_if = "Option::is_none")]
1850    pub r#type: Option<String>,
1851}
1852
1853#[derive(Debug, Clone, Serialize, Deserialize)]
1854pub struct RepoTree {
1855    #[serde(skip_serializing_if = "Option::is_none")]
1856    pub sha: Option<String>,
1857    /// Да
1858    #[serde(default, deserialize_with = "crate::deserialize_null_as_default")]
1859    pub tree: Vec<TreeEntry>,
1860    #[serde(skip_serializing_if = "Option::is_none")]
1861    pub truncated: Option<bool>,
1862    #[serde(skip_serializing_if = "Option::is_none")]
1863    pub url: Option<String>,
1864}
1865
1866#[derive(Debug, Clone, Serialize, Deserialize)]
1867pub struct RunsResponse {
1868    #[serde(skip_serializing_if = "Option::is_none")]
1869    pub total_count: Option<f64>,
1870    #[serde(skip_serializing_if = "Option::is_none")]
1871    pub workflow_runs: Option<Vec<ActionRun>>,
1872}
1873
1874#[derive(Debug, Clone, Serialize, Deserialize)]
1875pub struct Secret {
1876    #[serde(skip_serializing_if = "Option::is_none")]
1877    pub created_at: Option<String>,
1878    #[serde(skip_serializing_if = "Option::is_none")]
1879    pub name: Option<String>,
1880}
1881
1882#[derive(Debug, Clone, Serialize, Deserialize)]
1883pub struct SecretList {
1884    #[serde(skip_serializing_if = "Option::is_none")]
1885    pub secrets: Option<Vec<Secret>>,
1886    #[serde(skip_serializing_if = "Option::is_none")]
1887    pub total_count: Option<f64>,
1888}
1889
1890#[derive(Debug, Clone, Serialize, Deserialize)]
1891pub struct TrackedTime {
1892    /// swagger:strfmt date-time
1893    #[serde(skip_serializing_if = "Option::is_none")]
1894    pub created: Option<String>,
1895    #[serde(skip_serializing_if = "Option::is_none")]
1896    pub id: Option<f64>,
1897    #[serde(skip_serializing_if = "Option::is_none")]
1898    pub issue: Option<Issue>,
1899    /// deprecated (only for backwards compatibility)
1900    #[serde(skip_serializing_if = "Option::is_none")]
1901    pub issue_id: Option<f64>,
1902    /// Time in seconds
1903    #[serde(skip_serializing_if = "Option::is_none")]
1904    pub time: Option<f64>,
1905    /// deprecated (only for backwards compatibility)
1906    #[serde(skip_serializing_if = "Option::is_none")]
1907    pub user_id: Option<f64>,
1908    #[serde(skip_serializing_if = "Option::is_none")]
1909    pub user_name: Option<String>,
1910}
1911
1912#[derive(Debug, Clone, Serialize, Deserialize)]
1913pub struct TimelineComment {
1914    /// Назначенный пользователь (только для assigned/unassigned)
1915    pub assignee: User,
1916    #[serde(skip_serializing_if = "Option::is_none")]
1917    pub assignee_team: Option<Team>,
1918    /// Текст комментария (только для type: commented)
1919    #[serde(skip_serializing_if = "Option::is_none")]
1920    pub body: Option<String>,
1921    /// Дата события (RFC3339)
1922    pub created_at: String,
1923    #[serde(skip_serializing_if = "Option::is_none")]
1924    pub dependent_issue: Option<Issue>,
1925    /// Ссылка на событие в веб-интерфейсе (если применимо)
1926    pub html_url: String,
1927    /// Уникальный идентификатор события
1928    pub id: f64,
1929    #[serde(skip_serializing_if = "Option::is_none")]
1930    pub issue_url: Option<String>,
1931    /// Метка (только для labeled/unlabeled)
1932    pub label: Label,
1933    #[serde(skip_serializing_if = "Option::is_none")]
1934    pub milestone: Option<Milestone>,
1935    #[serde(skip_serializing_if = "Option::is_none")]
1936    pub new_ref: Option<String>,
1937    #[serde(skip_serializing_if = "Option::is_none")]
1938    pub new_title: Option<String>,
1939    #[serde(skip_serializing_if = "Option::is_none")]
1940    pub old_milestone: Option<Milestone>,
1941    #[serde(skip_serializing_if = "Option::is_none")]
1942    pub old_project_id: Option<f64>,
1943    #[serde(skip_serializing_if = "Option::is_none")]
1944    pub old_ref: Option<String>,
1945    #[serde(skip_serializing_if = "Option::is_none")]
1946    pub old_title: Option<String>,
1947    #[serde(skip_serializing_if = "Option::is_none")]
1948    pub project_id: Option<f64>,
1949    #[serde(skip_serializing_if = "Option::is_none")]
1950    pub pull_request_url: Option<String>,
1951    #[serde(skip_serializing_if = "Option::is_none")]
1952    pub ref_action: Option<String>,
1953    #[serde(skip_serializing_if = "Option::is_none")]
1954    pub ref_comment: Option<Comment>,
1955    /// commit SHA where issue/PR was referenced
1956    #[serde(skip_serializing_if = "Option::is_none")]
1957    pub ref_commit_sha: Option<String>,
1958    #[serde(skip_serializing_if = "Option::is_none")]
1959    pub ref_issue: Option<Issue>,
1960    /// whether the assignees were removed or added
1961    #[serde(skip_serializing_if = "Option::is_none")]
1962    pub removed_assignee: Option<bool>,
1963    #[serde(skip_serializing_if = "Option::is_none")]
1964    pub resolve_doer: Option<User>,
1965    #[serde(skip_serializing_if = "Option::is_none")]
1966    pub review_id: Option<f64>,
1967    #[serde(skip_serializing_if = "Option::is_none")]
1968    pub tracked_time: Option<TrackedTime>,
1969    /// Тип события (например, commented, labeled, closed)
1970    pub r#type: String,
1971    /// swagger:strfmt date-time
1972    #[serde(skip_serializing_if = "Option::is_none")]
1973    pub updated_at: Option<String>,
1974    /// Автор события
1975    pub user: User,
1976}
1977
1978#[derive(Debug, Clone, Serialize, Deserialize)]
1979pub struct UpdateBranchResponse {
1980    #[serde(skip_serializing_if = "Option::is_none")]
1981    pub message: Option<String>,
1982    #[serde(skip_serializing_if = "Option::is_none")]
1983    pub url: Option<String>,
1984}
1985
1986#[derive(Debug, Clone, Serialize, Deserialize)]
1987pub struct UserPrefsArray {
1988    #[serde(skip_serializing_if = "Option::is_none")]
1989    pub incomplete_results: Option<bool>,
1990    #[serde(skip_serializing_if = "Option::is_none")]
1991    pub items: Option<Vec<User>>,
1992    #[serde(skip_serializing_if = "Option::is_none")]
1993    pub total_count: Option<f64>,
1994}
1995
1996#[derive(Debug, Clone, Serialize, Deserialize)]
1997pub struct Variable {
1998    #[serde(skip_serializing_if = "Option::is_none")]
1999    pub created_at: Option<String>,
2000    #[serde(skip_serializing_if = "Option::is_none")]
2001    pub name: Option<String>,
2002    #[serde(skip_serializing_if = "Option::is_none")]
2003    pub updated_at: Option<String>,
2004    #[serde(skip_serializing_if = "Option::is_none")]
2005    pub value: Option<String>,
2006}
2007
2008#[derive(Debug, Clone, Serialize, Deserialize)]
2009pub struct VariableList {
2010    #[serde(skip_serializing_if = "Option::is_none")]
2011    pub total_count: Option<f64>,
2012    #[serde(skip_serializing_if = "Option::is_none")]
2013    pub variables: Option<Vec<Variable>>,
2014}
2015
2016#[derive(Debug, Clone, Serialize, Deserialize)]
2017pub struct Webhook {
2018    #[serde(skip_serializing_if = "Option::is_none")]
2019    pub active: Option<bool>,
2020    #[serde(skip_serializing_if = "Option::is_none")]
2021    pub config: Option<WebhookConfig>,
2022    #[serde(skip_serializing_if = "Option::is_none")]
2023    pub created_at: Option<String>,
2024    #[serde(skip_serializing_if = "Option::is_none")]
2025    pub events: Option<Vec<String>>,
2026    #[serde(skip_serializing_if = "Option::is_none")]
2027    pub id: Option<f64>,
2028    #[serde(skip_serializing_if = "Option::is_none")]
2029    pub last_response_status: Option<String>,
2030    #[serde(skip_serializing_if = "Option::is_none")]
2031    pub r#type: Option<String>,
2032    #[serde(skip_serializing_if = "Option::is_none")]
2033    pub updated_at: Option<String>,
2034}
2035
2036#[derive(Debug, Clone, Serialize, Deserialize)]
2037pub struct WorkflowDispatchInput {
2038    #[serde(skip_serializing_if = "Option::is_none")]
2039    pub default: Option<String>,
2040    #[serde(skip_serializing_if = "Option::is_none")]
2041    pub description: Option<String>,
2042    #[serde(skip_serializing_if = "Option::is_none")]
2043    pub name: Option<String>,
2044    #[serde(skip_serializing_if = "Option::is_none")]
2045    pub options: Option<Vec<String>>,
2046    #[serde(skip_serializing_if = "Option::is_none")]
2047    pub required: Option<bool>,
2048    #[serde(skip_serializing_if = "Option::is_none")]
2049    pub r#type: Option<String>,
2050}
2051
2052#[derive(Debug, Clone, Serialize, Deserialize)]
2053pub struct WorkflowDispatchInputList {
2054    #[serde(skip_serializing_if = "Option::is_none")]
2055    pub inputs: Option<Vec<WorkflowDispatchInput>>,
2056}