1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
use derive_builder::Builder;
use http::Method;
use std::borrow::Cow;
use crate::api::{Endpoint, ReturnsJsonResponse};
#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct IssueStatusEssentials {
pub id: u64,
pub name: String,
}
impl From<IssueStatus> for IssueStatusEssentials {
fn from(v: IssueStatus) -> Self {
IssueStatusEssentials {
id: v.id,
name: v.name,
}
}
}
impl From<&IssueStatus> for IssueStatusEssentials {
fn from(v: &IssueStatus) -> Self {
IssueStatusEssentials {
id: v.id,
name: v.name.to_owned(),
}
}
}
#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct IssueStatus {
pub id: u64,
pub name: String,
pub is_closed: bool,
}
#[derive(Debug, Builder)]
#[builder(setter(strip_option))]
pub struct ListIssueStatuses {}
impl<'a> ReturnsJsonResponse for ListIssueStatuses {}
impl ListIssueStatuses {
#[must_use]
pub fn builder() -> ListIssueStatusesBuilder {
ListIssueStatusesBuilder::default()
}
}
impl<'a> Endpoint for ListIssueStatuses {
fn method(&self) -> Method {
Method::GET
}
fn endpoint(&self) -> Cow<'static, str> {
"issue_statuses.json".into()
}
}
#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct IssueStatusesWrapper<T> {
pub issue_statuses: Vec<T>,
}
#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct IssueStatusWrapper<T> {
pub issue_status: T,
}
#[cfg(test)]
mod test {
use super::*;
use pretty_assertions::assert_eq;
use std::error::Error;
use tracing_test::traced_test;
#[traced_test]
#[test]
fn test_list_issue_statuses_no_pagination() -> Result<(), Box<dyn Error>> {
dotenv::dotenv()?;
let redmine = crate::api::Redmine::from_env()?;
let endpoint = ListIssueStatuses::builder().build()?;
redmine.json_response_body::<_, IssueStatusesWrapper<IssueStatus>>(&endpoint)?;
Ok(())
}
#[traced_test]
#[test]
fn test_completeness_issue_status_type() -> Result<(), Box<dyn Error>> {
dotenv::dotenv()?;
let redmine = crate::api::Redmine::from_env()?;
let endpoint = ListIssueStatuses::builder().build()?;
let IssueStatusesWrapper {
issue_statuses: values,
} = redmine.json_response_body::<_, IssueStatusesWrapper<serde_json::Value>>(&endpoint)?;
for value in values {
let o: IssueStatus = serde_json::from_value(value.clone())?;
let reserialized = serde_json::to_value(o)?;
assert_eq!(value, reserialized);
}
Ok(())
}
}