bitbucket_cli/models/
pr.rs

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}