bitbucket_cli/models/
issue.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4use super::user::{Link, User};
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct Issue {
8    pub id: u64,
9    pub title: String,
10    pub content: Option<IssueContent>,
11    pub reporter: Option<User>,
12    pub assignee: Option<User>,
13    pub state: IssueState,
14    pub kind: IssueKind,
15    pub priority: IssuePriority,
16    pub milestone: Option<Milestone>,
17    pub component: Option<Component>,
18    pub version: Option<Version>,
19    pub votes: Option<u32>,
20    pub watches: Option<u32>,
21    pub created_on: DateTime<Utc>,
22    pub updated_on: Option<DateTime<Utc>>,
23    pub edited_on: Option<DateTime<Utc>>,
24    pub links: Option<IssueLinks>,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct IssueContent {
29    pub raw: Option<String>,
30    pub markup: Option<String>,
31    pub html: Option<String>,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
35#[serde(rename_all = "lowercase")]
36pub enum IssueState {
37    New,
38    Open,
39    Resolved,
40    #[serde(rename = "on hold")]
41    OnHold,
42    Invalid,
43    Duplicate,
44    Wontfix,
45    Closed,
46}
47
48impl std::fmt::Display for IssueState {
49    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
50        match self {
51            IssueState::New => write!(f, "new"),
52            IssueState::Open => write!(f, "open"),
53            IssueState::Resolved => write!(f, "resolved"),
54            IssueState::OnHold => write!(f, "on hold"),
55            IssueState::Invalid => write!(f, "invalid"),
56            IssueState::Duplicate => write!(f, "duplicate"),
57            IssueState::Wontfix => write!(f, "wontfix"),
58            IssueState::Closed => write!(f, "closed"),
59        }
60    }
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
64#[serde(rename_all = "lowercase")]
65pub enum IssueKind {
66    Bug,
67    Enhancement,
68    Proposal,
69    Task,
70}
71
72impl std::fmt::Display for IssueKind {
73    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74        match self {
75            IssueKind::Bug => write!(f, "bug"),
76            IssueKind::Enhancement => write!(f, "enhancement"),
77            IssueKind::Proposal => write!(f, "proposal"),
78            IssueKind::Task => write!(f, "task"),
79        }
80    }
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
84#[serde(rename_all = "lowercase")]
85pub enum IssuePriority {
86    Trivial,
87    Minor,
88    Major,
89    Critical,
90    Blocker,
91}
92
93impl std::fmt::Display for IssuePriority {
94    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
95        match self {
96            IssuePriority::Trivial => write!(f, "trivial"),
97            IssuePriority::Minor => write!(f, "minor"),
98            IssuePriority::Major => write!(f, "major"),
99            IssuePriority::Critical => write!(f, "critical"),
100            IssuePriority::Blocker => write!(f, "blocker"),
101        }
102    }
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize)]
106pub struct Milestone {
107    pub id: u64,
108    pub name: String,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct Component {
113    pub id: u64,
114    pub name: String,
115}
116
117#[derive(Debug, Clone, Serialize, Deserialize)]
118pub struct Version {
119    pub id: u64,
120    pub name: String,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize)]
124pub struct IssueLinks {
125    #[serde(rename = "self")]
126    pub self_link: Option<Link>,
127    pub html: Option<Link>,
128    pub comments: Option<Link>,
129    pub attachments: Option<Link>,
130    pub watch: Option<Link>,
131    pub vote: Option<Link>,
132}
133
134#[derive(Debug, Clone, Serialize, Deserialize)]
135pub struct CreateIssueRequest {
136    pub title: String,
137    pub content: Option<IssueContentRequest>,
138    pub kind: Option<IssueKind>,
139    pub priority: Option<IssuePriority>,
140    pub assignee: Option<UserAccountId>,
141    pub component: Option<ComponentName>,
142    pub milestone: Option<MilestoneName>,
143    pub version: Option<VersionName>,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
147pub struct IssueContentRequest {
148    pub raw: String,
149}
150
151#[derive(Debug, Clone, Serialize, Deserialize)]
152pub struct UserAccountId {
153    pub account_id: String,
154}
155
156#[derive(Debug, Clone, Serialize, Deserialize)]
157pub struct ComponentName {
158    pub name: String,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize)]
162pub struct MilestoneName {
163    pub name: String,
164}
165
166#[derive(Debug, Clone, Serialize, Deserialize)]
167pub struct VersionName {
168    pub name: String,
169}
170
171#[derive(Debug, Clone, Serialize, Deserialize)]
172pub struct IssueComment {
173    pub id: u64,
174    pub content: IssueContent,
175    pub user: User,
176    pub created_on: DateTime<Utc>,
177    pub updated_on: Option<DateTime<Utc>>,
178    pub links: Option<IssueCommentLinks>,
179}
180
181#[derive(Debug, Clone, Serialize, Deserialize)]
182pub struct IssueCommentLinks {
183    #[serde(rename = "self")]
184    pub self_link: Option<Link>,
185    pub html: Option<Link>,
186}
187
188#[derive(Debug, Clone, Serialize, Deserialize)]
189pub struct CreateIssueCommentRequest {
190    pub content: IssueContentRequest,
191}