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}