redmine_api/api/
my_account.rs1use derive_builder::Builder;
8use reqwest::Method;
9use std::borrow::Cow;
10
11use crate::api::custom_fields::CustomFieldEssentialsWithValue;
12use crate::api::{Endpoint, ReturnsJsonResponse};
13
14#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
18pub struct MyAccount {
19 pub id: u64,
21 pub login: String,
23 pub admin: bool,
25 pub firstname: String,
27 pub lastname: String,
29 #[serde(default, skip_serializing_if = "Option::is_none")]
31 pub mail: Option<String>,
32 #[serde(
34 serialize_with = "crate::api::serialize_rfc3339",
35 deserialize_with = "crate::api::deserialize_rfc3339"
36 )]
37 pub created_on: time::OffsetDateTime,
38 #[serde(
40 serialize_with = "crate::api::serialize_optional_rfc3339",
41 deserialize_with = "crate::api::deserialize_optional_rfc3339"
42 )]
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub last_login_on: Option<time::OffsetDateTime>,
45 pub api_key: String,
47 #[serde(default, skip_serializing_if = "Option::is_none")]
49 pub custom_fields: Option<Vec<CustomFieldEssentialsWithValue>>,
50}
51
52#[derive(Debug, Clone, Builder)]
54#[builder(setter(strip_option))]
55pub struct GetMyAccount {}
56
57impl ReturnsJsonResponse for GetMyAccount {}
58
59impl GetMyAccount {
60 #[must_use]
62 pub fn builder() -> GetMyAccountBuilder {
63 GetMyAccountBuilder::default()
64 }
65}
66
67impl Endpoint for GetMyAccount {
68 fn method(&self) -> Method {
69 Method::GET
70 }
71
72 fn endpoint(&self) -> Cow<'static, str> {
73 "my/account.json".into()
74 }
75}
76
77#[cfg(test)]
78mod test {
79 use super::*;
80 use crate::api::users::UserWrapper;
81 use pretty_assertions::assert_eq;
82 use std::error::Error;
83 use tracing_test::traced_test;
84
85 #[traced_test]
86 #[test]
87 fn test_get_my_account() -> Result<(), Box<dyn Error>> {
88 dotenvy::dotenv()?;
89 let redmine = crate::api::Redmine::from_env()?;
90 let endpoint = GetMyAccount::builder().build()?;
91 redmine.json_response_body::<_, UserWrapper<MyAccount>>(&endpoint)?;
92 Ok(())
93 }
94
95 #[traced_test]
100 #[test]
101 fn test_completeness_my_account_type() -> Result<(), Box<dyn Error>> {
102 dotenvy::dotenv()?;
103 let redmine = crate::api::Redmine::from_env()?;
104 let endpoint = GetMyAccount::builder().build()?;
105 let UserWrapper { user: value } =
106 redmine.json_response_body::<_, UserWrapper<serde_json::Value>>(&endpoint)?;
107 let o: MyAccount = serde_json::from_value(value.clone())?;
108 let reserialized = serde_json::to_value(o)?;
109 assert_eq!(value, reserialized);
110 Ok(())
111 }
112}