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
use derive_builder::Builder;
use http::Method;
use std::borrow::Cow;
use crate::api::issue_statuses::IssueStatusEssentials;
use crate::api::{Endpoint, ReturnsJsonResponse};
#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct TrackerEssentials {
pub id: u64,
pub name: String,
}
impl From<Tracker> for TrackerEssentials {
fn from(v: Tracker) -> Self {
TrackerEssentials {
id: v.id,
name: v.name,
}
}
}
impl From<&Tracker> for TrackerEssentials {
fn from(v: &Tracker) -> Self {
TrackerEssentials {
id: v.id,
name: v.name.to_owned(),
}
}
}
#[derive(Debug, serde::Serialize, serde::Deserialize)]
pub struct Tracker {
pub id: u64,
pub name: String,
pub default_status: IssueStatusEssentials,
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled_standard_fields: Option<Vec<String>>,
}
#[derive(Debug, Builder)]
#[builder(setter(strip_option))]
pub struct ListTrackers {}
impl ReturnsJsonResponse for ListTrackers {}
impl ListTrackers {
#[must_use]
pub fn builder() -> ListTrackersBuilder {
ListTrackersBuilder::default()
}
}
impl Endpoint for ListTrackers {
fn method(&self) -> Method {
Method::GET
}
fn endpoint(&self) -> Cow<'static, str> {
"trackers.json".into()
}
}
#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct TrackersWrapper<T> {
pub trackers: Vec<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_trackers_no_pagination() -> Result<(), Box<dyn Error>> {
dotenv::dotenv()?;
let redmine = crate::api::Redmine::from_env()?;
let endpoint = ListTrackers::builder().build()?;
redmine.json_response_body::<_, TrackersWrapper<Tracker>>(&endpoint)?;
Ok(())
}
#[traced_test]
#[test]
fn test_completeness_tracker_type() -> Result<(), Box<dyn Error>> {
dotenv::dotenv()?;
let redmine = crate::api::Redmine::from_env()?;
let endpoint = ListTrackers::builder().build()?;
let TrackersWrapper { trackers: values } =
redmine.json_response_body::<_, TrackersWrapper<serde_json::Value>>(&endpoint)?;
for value in values {
let o: Tracker = serde_json::from_value(value.clone())?;
let reserialized = serde_json::to_value(o)?;
assert_eq!(value, reserialized);
}
Ok(())
}
}