redmine_api/api/
issue_statuses.rs1use derive_builder::Builder;
8use reqwest::Method;
9use std::borrow::Cow;
10
11use crate::api::{Endpoint, NoPagination, ReturnsJsonResponse};
12
13#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
16pub struct IssueStatusEssentials {
17 pub id: u64,
19 #[serde(default, skip_serializing_if = "Option::is_none")]
21 pub is_closed: Option<bool>,
22 pub name: String,
24}
25
26impl From<IssueStatus> for IssueStatusEssentials {
27 fn from(v: IssueStatus) -> Self {
28 IssueStatusEssentials {
29 id: v.id,
30 is_closed: Some(v.is_closed),
31 name: v.name,
32 }
33 }
34}
35
36impl From<&IssueStatus> for IssueStatusEssentials {
37 fn from(v: &IssueStatus) -> Self {
38 IssueStatusEssentials {
39 id: v.id,
40 is_closed: Some(v.is_closed),
41 name: v.name.to_owned(),
42 }
43 }
44}
45
46#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
50pub struct IssueStatus {
51 pub id: u64,
53 pub name: String,
55 pub description: Option<String>,
57 pub is_closed: bool,
59}
60
61#[derive(Debug, Clone, Builder)]
63#[builder(setter(strip_option))]
64pub struct ListIssueStatuses {}
65
66impl ReturnsJsonResponse for ListIssueStatuses {}
67impl NoPagination for ListIssueStatuses {}
68
69impl ListIssueStatuses {
70 #[must_use]
72 pub fn builder() -> ListIssueStatusesBuilder {
73 ListIssueStatusesBuilder::default()
74 }
75}
76
77impl Endpoint for ListIssueStatuses {
78 fn method(&self) -> Method {
79 Method::GET
80 }
81
82 fn endpoint(&self) -> Cow<'static, str> {
83 "issue_statuses.json".into()
84 }
85}
86
87#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
89pub struct IssueStatusesWrapper<T> {
90 pub issue_statuses: Vec<T>,
92}
93
94#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
97pub struct IssueStatusWrapper<T> {
98 pub issue_status: T,
100}
101
102#[cfg(test)]
103mod test {
104 use super::*;
105 use pretty_assertions::assert_eq;
106 use std::error::Error;
107 use tracing_test::traced_test;
108
109 #[traced_test]
110 #[test]
111 fn test_list_issue_statuses_no_pagination() -> Result<(), Box<dyn Error>> {
112 dotenvy::dotenv()?;
113 let redmine = crate::api::Redmine::from_env(
114 reqwest::blocking::Client::builder()
115 .use_rustls_tls()
116 .build()?,
117 )?;
118 let endpoint = ListIssueStatuses::builder().build()?;
119 redmine.json_response_body::<_, IssueStatusesWrapper<IssueStatus>>(&endpoint)?;
120 Ok(())
121 }
122
123 #[traced_test]
128 #[test]
129 fn test_completeness_issue_status_type() -> Result<(), Box<dyn Error>> {
130 dotenvy::dotenv()?;
131 let redmine = crate::api::Redmine::from_env(
132 reqwest::blocking::Client::builder()
133 .use_rustls_tls()
134 .build()?,
135 )?;
136 let endpoint = ListIssueStatuses::builder().build()?;
137 let IssueStatusesWrapper {
138 issue_statuses: values,
139 } = redmine.json_response_body::<_, IssueStatusesWrapper<serde_json::Value>>(&endpoint)?;
140 for value in values {
141 let o: IssueStatus = serde_json::from_value(value.clone())?;
142 let reserialized = serde_json::to_value(o)?;
143 assert_eq!(value, reserialized);
144 }
145 Ok(())
146 }
147}