1use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
8pub enum Section {
9 #[default]
10 PullRequests,
11 WorkItems,
12 Pipelines,
13}
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
17pub enum ProviderType {
18 Demo,
19 GitHub,
20 AzureDevOps,
21 Linear,
22 GitLab,
23 Bitbucket,
24 Jira,
25}
26
27impl ProviderType {
28 pub fn as_str(&self) -> &'static str {
29 match self {
30 ProviderType::Demo => "Demo",
31 ProviderType::GitHub => "GitHub",
32 ProviderType::AzureDevOps => "AzureDevOps",
33 ProviderType::Linear => "Linear",
34 ProviderType::GitLab => "GitLab",
35 ProviderType::Bitbucket => "Bitbucket",
36 ProviderType::Jira => "Jira",
37 }
38 }
39}
40
41#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
42pub enum PullRequestStatus {
43 Open,
44 Draft,
45 Merged,
46 Closed,
47}
48
49#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
51pub enum ReviewVote {
52 Rejected,
53 WaitingForAuthor,
54 NoVote,
55 ApprovedWithSuggestions,
56 Approved,
57}
58
59#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
60pub enum WorkItemStateCategory {
61 Triage,
62 Backlog,
63 Unstarted,
64 Started,
65 Completed,
66 Canceled,
67}
68
69#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
70pub enum PipelineRunStatus {
71 Queued,
72 Running,
73 Succeeded,
74 PartiallySucceeded,
75 Failed,
76 Canceled,
77}
78
79#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
81pub enum CheckStatus {
82 #[default]
83 None,
84 Pending,
85 Passed,
86 Failed,
87}
88
89#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
91pub enum MergeableState {
92 #[default]
93 Unknown,
94 Mergeable,
95 Blocked,
96 Conflicting,
97}
98
99#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
100pub enum FileChangeKind {
101 Added,
102 Modified,
103 Deleted,
104 Renamed,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
110pub struct User {
111 pub id: String,
112 pub display_name: String,
113 pub handle: Option<String>,
114 pub avatar_url: Option<String>,
115}
116
117#[derive(Debug, Clone, Serialize, Deserialize)]
118pub struct Repository {
119 pub id: String,
120 pub name: String,
121 pub full_name: Option<String>,
122 pub default_branch: Option<String>,
123 pub url: Option<String>,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize)]
127pub struct Comment {
128 pub id: String,
129 pub author: User,
130 pub body: String,
131 pub created_at: Option<DateTime<Utc>>,
132}
133
134#[derive(Debug, Clone, Serialize, Deserialize)]
135pub struct CommentThread {
136 pub id: String,
137 pub comments: Vec<Comment>,
138 pub file_path: Option<String>,
139 pub line: Option<i64>,
140 pub is_resolved: bool,
141}
142
143#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
145pub enum TimelineEventKind {
146 Approved,
147 ChangesRequested,
148 Reviewed,
149 Commented,
150 Merged,
151 Closed,
152 Reopened,
153 StateChanged,
154 Assigned,
155 Labeled,
156 Committed,
157 Other,
158}
159
160#[derive(Debug, Clone, Serialize, Deserialize)]
164pub struct TimelineEvent {
165 pub actor: Option<User>,
166 pub kind: TimelineEventKind,
167 pub summary: String,
169 pub at: Option<DateTime<Utc>>,
170}
171
172#[derive(Debug, Clone, Serialize, Deserialize)]
173pub struct Reviewer {
174 pub user: User,
175 pub vote: ReviewVote,
176 pub is_required: bool,
177}
178
179#[derive(Debug, Clone, Default, Serialize, Deserialize)]
180pub struct CheckSummary {
181 pub successful: u32,
182 pub in_progress: u32,
183 pub failed: u32,
184 pub neutral: u32,
185}
186
187impl CheckSummary {
188 pub fn total(&self) -> u32 {
189 self.successful + self.in_progress + self.failed + self.neutral
190 }
191}
192
193#[derive(Debug, Clone, Serialize, Deserialize)]
195pub struct CheckRun {
196 pub name: String,
197 pub status: CheckStatus,
198 pub url: Option<String>,
199}
200
201#[derive(Debug, Clone, Serialize, Deserialize)]
203pub struct Commit {
204 pub sha: String,
205 pub message: String,
206 pub author: String,
207 pub date: Option<DateTime<Utc>>,
208 pub url: Option<String>,
209}
210
211#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
213pub enum DiffSide {
214 Old,
215 New,
216}
217
218#[derive(Debug, Clone, Serialize, Deserialize)]
220pub struct LineComment {
221 pub path: String,
222 pub line: i64,
223 pub side: DiffSide,
224 pub body: String,
225}
226
227#[derive(Debug, Clone, Serialize, Deserialize)]
228pub struct FileChange {
229 pub path: String,
230 pub kind: FileChangeKind,
231 pub additions: i64,
232 pub deletions: i64,
233 pub patch: Option<String>,
235}
236
237#[derive(Debug, Clone, Serialize, Deserialize)]
238pub struct PullRequest {
239 pub id: String,
240 #[serde(default, skip_serializing_if = "Option::is_none")]
243 pub repository: Option<String>,
244 pub number: Option<i64>,
245 pub title: String,
246 pub description: Option<String>,
247 pub author: User,
248 pub status: PullRequestStatus,
249 pub is_draft: bool,
250 pub source_ref: Option<String>,
251 pub target_ref: Option<String>,
252 pub reviewers: Vec<Reviewer>,
253 pub labels: Vec<String>,
254 pub checks: CheckStatus,
255 pub check_summary: Option<CheckSummary>,
256 pub mergeable: MergeableState,
257 pub changed_files: i64,
258 pub additions: i64,
259 pub deletions: i64,
260 pub created_at: Option<DateTime<Utc>>,
261 pub updated_at: Option<DateTime<Utc>>,
262 pub url: Option<String>,
263}
264
265#[derive(Debug, Clone, Serialize, Deserialize)]
266pub struct WorkItem {
267 pub id: String,
268 #[serde(default, skip_serializing_if = "Option::is_none")]
272 pub repository: Option<String>,
273 pub identifier: Option<String>,
274 pub title: String,
275 pub description: Option<String>,
276 pub state: String,
277 pub state_category: WorkItemStateCategory,
278 pub work_item_type: Option<String>,
279 pub assignee: Option<User>,
280 pub created_at: Option<DateTime<Utc>>,
281 pub updated_at: Option<DateTime<Utc>>,
282 pub url: Option<String>,
283}
284
285#[derive(Debug, Clone, Serialize, Deserialize)]
286pub struct PipelineDefinition {
287 pub id: String,
288 #[serde(default, skip_serializing_if = "Option::is_none")]
291 pub repository: Option<String>,
292 pub name: String,
293 pub path: Option<String>,
294 pub url: Option<String>,
295}
296
297#[derive(Debug, Clone, Serialize, Deserialize)]
298pub struct PipelineStep {
299 pub name: String,
300 pub status: PipelineRunStatus,
301 pub started_at: Option<DateTime<Utc>>,
302 pub finished_at: Option<DateTime<Utc>>,
303}
304
305#[derive(Debug, Clone, Serialize, Deserialize)]
306pub struct PipelineJob {
307 pub id: String,
308 pub name: String,
309 pub status: PipelineRunStatus,
310 pub started_at: Option<DateTime<Utc>>,
311 pub finished_at: Option<DateTime<Utc>>,
312 pub steps: Vec<PipelineStep>,
313 pub url: Option<String>,
315 pub problem: Option<String>,
318}
319
320#[derive(Debug, Clone, Serialize, Deserialize)]
321pub struct PipelineStage {
322 pub name: String,
323 pub status: PipelineRunStatus,
324 pub jobs: Vec<PipelineJob>,
325}
326
327#[derive(Debug, Clone, Serialize, Deserialize)]
328pub struct PipelineRun {
329 pub id: String,
330 #[serde(default, skip_serializing_if = "Option::is_none")]
333 pub repository: Option<String>,
334 pub definition_id: String,
335 pub number: Option<i64>,
336 pub name: Option<String>,
337 pub title: Option<String>,
340 pub status: PipelineRunStatus,
341 pub triggered_by: Option<User>,
342 pub branch: Option<String>,
343 pub commit_sha: Option<String>,
344 pub started_at: Option<DateTime<Utc>>,
345 pub finished_at: Option<DateTime<Utc>>,
346 pub url: Option<String>,
347 pub stages: Vec<PipelineStage>,
348 #[serde(default, skip_serializing_if = "Option::is_none")]
351 pub event: Option<String>,
352 #[serde(default, skip_serializing_if = "Option::is_none")]
355 pub attempt: Option<u32>,
356 #[serde(default, skip_serializing_if = "Option::is_none")]
358 pub pull_request: Option<i64>,
359}
360
361#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
364pub enum AnnotationLevel {
365 Failure,
366 Warning,
367 Notice,
368}
369
370#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
373pub struct PipelineAnnotation {
374 pub level: AnnotationLevel,
375 pub message: String,
376 pub title: Option<String>,
378 pub path: Option<String>,
380 pub line: Option<u32>,
381 pub job_id: Option<String>,
383}
384
385#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
387pub struct PipelineArtifact {
388 pub id: String,
389 pub name: String,
390 pub size_bytes: Option<u64>,
391 pub expires_at: Option<DateTime<Utc>>,
392 pub url: Option<String>,
394}
395
396#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
399pub struct PipelineApproval {
400 pub id: String,
403 pub name: String,
405 pub can_respond: bool,
407}
408
409impl PullRequest {
412 pub fn item_ref(&self) -> crate::provider::ItemRef {
413 crate::provider::ItemRef::maybe(self.repository.clone(), self.id.clone())
414 }
415}
416
417impl WorkItem {
418 pub fn item_ref(&self) -> crate::provider::ItemRef {
419 crate::provider::ItemRef::maybe(self.repository.clone(), self.id.clone())
420 }
421}
422
423impl PipelineRun {
424 pub fn item_ref(&self) -> crate::provider::ItemRef {
425 crate::provider::ItemRef::maybe(self.repository.clone(), self.id.clone())
426 }
427
428 pub fn definition_ref(&self) -> crate::provider::ItemRef {
430 crate::provider::ItemRef::maybe(self.repository.clone(), self.definition_id.clone())
431 }
432}
433
434impl PipelineDefinition {
435 pub fn item_ref(&self) -> crate::provider::ItemRef {
436 crate::provider::ItemRef::maybe(self.repository.clone(), self.id.clone())
437 }
438}
439
440#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
442pub enum ApprovalDecision {
443 Approve,
444 Reject,
445}
446
447#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
449pub enum NotificationKind {
450 ReviewRequested,
452 Mention,
454 Assigned,
456 CiFailed,
458 Comment,
460 StateChange,
462 Other,
464}
465
466#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
468pub enum NotificationItemType {
469 PullRequest,
470 WorkItem,
471 Pipeline,
472 Other,
473}
474
475#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
477pub struct Notification {
478 pub id: String,
480 pub kind: NotificationKind,
481 pub item_type: NotificationItemType,
482 pub item_id: Option<String>,
485 #[serde(default, skip_serializing_if = "Option::is_none")]
488 pub repository: Option<String>,
489 pub title: String,
491 pub context: String,
493 pub url: Option<String>,
495 pub unread: bool,
496 pub updated_at: Option<DateTime<Utc>>,
497}