1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4use super::repo::Repository;
5use super::user::{Link, User};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct PullRequest {
9 pub id: u64,
10 pub title: String,
11 pub description: Option<String>,
12 pub state: PullRequestState,
13 pub author: User,
14 pub source: PullRequestEndpoint,
15 pub destination: PullRequestEndpoint,
16 pub merge_commit: Option<Commit>,
17 pub close_source_branch: Option<bool>,
18 pub closed_by: Option<User>,
19 pub reason: Option<String>,
20 pub created_on: DateTime<Utc>,
21 pub updated_on: DateTime<Utc>,
22 pub reviewers: Option<Vec<User>>,
23 pub participants: Option<Vec<Participant>>,
24 pub links: Option<PullRequestLinks>,
25 pub comment_count: Option<u32>,
26 pub task_count: Option<u32>,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
30#[serde(rename_all = "UPPERCASE")]
31pub enum PullRequestState {
32 Open,
33 Merged,
34 Declined,
35 Superseded,
36}
37
38impl std::fmt::Display for PullRequestState {
39 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
40 match self {
41 PullRequestState::Open => write!(f, "OPEN"),
42 PullRequestState::Merged => write!(f, "MERGED"),
43 PullRequestState::Declined => write!(f, "DECLINED"),
44 PullRequestState::Superseded => write!(f, "SUPERSEDED"),
45 }
46 }
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct PullRequestEndpoint {
51 pub branch: BranchInfo,
52 pub commit: Option<CommitInfo>,
53 pub repository: Option<Repository>,
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
57pub struct BranchInfo {
58 pub name: String,
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize)]
62pub struct CommitInfo {
63 pub hash: String,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct Commit {
68 pub hash: String,
69 pub message: Option<String>,
70 pub author: Option<CommitAuthor>,
71 pub date: Option<DateTime<Utc>>,
72 pub links: Option<CommitLinks>,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
76pub struct CommitAuthor {
77 pub raw: Option<String>,
78 pub user: Option<User>,
79}
80
81#[derive(Debug, Clone, Serialize, Deserialize)]
82pub struct CommitLinks {
83 pub html: Option<Link>,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct Participant {
88 pub user: User,
89 pub role: ParticipantRole,
90 pub approved: bool,
91 pub state: Option<ParticipantState>,
92 pub participated_on: Option<DateTime<Utc>>,
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
96#[serde(rename_all = "UPPERCASE")]
97pub enum ParticipantRole {
98 Participant,
99 Reviewer,
100}
101
102#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
103#[serde(rename_all = "snake_case")]
104pub enum ParticipantState {
105 Approved,
106 ChangesRequested,
107 #[serde(other)]
108 None,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct PullRequestLinks {
113 #[serde(rename = "self")]
114 pub self_link: Option<Link>,
115 pub html: Option<Link>,
116 pub commits: Option<Link>,
117 pub approve: Option<Link>,
118 pub diff: Option<Link>,
119 pub diffstat: Option<Link>,
120 pub comments: Option<Link>,
121 pub activity: Option<Link>,
122 pub merge: Option<Link>,
123 pub decline: Option<Link>,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize)]
127pub struct CreatePullRequestRequest {
128 pub title: String,
129 pub source: PullRequestBranchRef,
130 pub destination: Option<PullRequestBranchRef>,
131 pub description: Option<String>,
132 pub close_source_branch: Option<bool>,
133 pub reviewers: Option<Vec<UserRef>>,
134}
135
136#[derive(Debug, Clone, Serialize, Deserialize)]
137pub struct PullRequestBranchRef {
138 pub branch: BranchInfo,
139}
140
141#[derive(Debug, Clone, Serialize, Deserialize)]
142pub struct UserRef {
143 pub uuid: String,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
147pub struct MergePullRequestRequest {
148 #[serde(rename = "type")]
149 pub merge_type: Option<String>,
150 pub message: Option<String>,
151 pub close_source_branch: Option<bool>,
152 pub merge_strategy: Option<MergeStrategy>,
153}
154
155#[derive(Debug, Clone, Serialize, Deserialize)]
156#[serde(rename_all = "snake_case")]
157pub enum MergeStrategy {
158 MergeCommit,
159 Squash,
160 FastForward,
161}
162
163impl Default for MergePullRequestRequest {
164 fn default() -> Self {
165 Self {
166 merge_type: Some("pullrequest".to_string()),
167 message: None,
168 close_source_branch: Some(true),
169 merge_strategy: Some(MergeStrategy::MergeCommit),
170 }
171 }
172}
173
174#[derive(Debug, Clone, Serialize, Deserialize)]
175pub struct PullRequestComment {
176 pub id: u64,
177 pub content: CommentContent,
178 pub user: User,
179 pub created_on: DateTime<Utc>,
180 pub updated_on: Option<DateTime<Utc>>,
181 pub deleted: Option<bool>,
182 pub inline: Option<InlineComment>,
183 pub parent: Option<CommentRef>,
184 pub links: Option<CommentLinks>,
185}
186
187#[derive(Debug, Clone, Serialize, Deserialize)]
188pub struct CommentContent {
189 pub raw: String,
190 pub markup: Option<String>,
191 pub html: Option<String>,
192}
193
194#[derive(Debug, Clone, Serialize, Deserialize)]
195pub struct InlineComment {
196 pub from: Option<u32>,
197 pub to: Option<u32>,
198 pub path: String,
199}
200
201#[derive(Debug, Clone, Serialize, Deserialize)]
202pub struct CommentRef {
203 pub id: u64,
204}
205
206#[derive(Debug, Clone, Serialize, Deserialize)]
207pub struct CommentLinks {
208 #[serde(rename = "self")]
209 pub self_link: Option<Link>,
210 pub html: Option<Link>,
211}