freedom_api/api/post/
user.rs

1use serde::Serialize;
2
3use crate::{api::Api, error::Error};
4
5use super::Post;
6
7#[derive(Debug, Clone, PartialEq, Serialize)]
8#[serde(rename_all = "camelCase")]
9pub struct User {
10    #[serde(skip_serializing)]
11    account_id: i32,
12    first_name: String,
13    last_name: String,
14    email: String,
15    machine_service: bool,
16    roles: Vec<String>,
17}
18
19pub struct UserBuilder<'a, C, S> {
20    client: &'a C,
21    state: S,
22}
23
24pub fn new<C>(client: &C) -> UserBuilder<'_, C, NoAccount> {
25    UserBuilder {
26        client,
27        state: NoAccount,
28    }
29}
30
31pub struct NoAccount;
32
33impl<'a, C> UserBuilder<'a, C, NoAccount> {
34    pub fn account_id(self, account_id: impl Into<i32>) -> UserBuilder<'a, C, NoFirstName> {
35        UserBuilder {
36            client: self.client,
37            state: NoFirstName {
38                account_id: account_id.into(),
39            },
40        }
41    }
42}
43
44pub struct NoFirstName {
45    account_id: i32,
46}
47
48impl<'a, C> UserBuilder<'a, C, NoFirstName> {
49    pub fn first_name(self, first_name: impl Into<String>) -> UserBuilder<'a, C, NoLastName> {
50        UserBuilder {
51            client: self.client,
52            state: NoLastName {
53                account_id: self.state.account_id,
54                first_name: first_name.into(),
55            },
56        }
57    }
58}
59
60pub struct NoLastName {
61    account_id: i32,
62    first_name: String,
63}
64
65impl<'a, C> UserBuilder<'a, C, NoLastName> {
66    pub fn last_name(self, last_name: impl Into<String>) -> UserBuilder<'a, C, NoEmail> {
67        UserBuilder {
68            client: self.client,
69            state: NoEmail {
70                account_id: self.state.account_id,
71                first_name: self.state.first_name,
72                last_name: last_name.into(),
73            },
74        }
75    }
76}
77
78pub struct NoEmail {
79    account_id: i32,
80    first_name: String,
81    last_name: String,
82}
83
84impl<'a, C> UserBuilder<'a, C, NoEmail> {
85    pub fn email(self, email: impl Into<String>) -> UserBuilder<'a, C, User> {
86        let state = User {
87            account_id: self.state.account_id,
88            first_name: self.state.first_name,
89            last_name: self.state.last_name,
90            email: email.into(),
91            machine_service: false,
92            roles: Vec::new(),
93        };
94
95        UserBuilder {
96            client: self.client,
97            state,
98        }
99    }
100}
101
102impl<C> UserBuilder<'_, C, User> {
103    pub fn add_role(mut self, role: impl Into<String>) -> Self {
104        self.state.roles.push(role.into());
105
106        self
107    }
108
109    pub fn add_roles<I, T>(mut self, roles: I) -> Self
110    where
111        I: IntoIterator<Item = T>,
112        T: Into<String>,
113    {
114        for role in roles {
115            self = self.add_role(role);
116        }
117
118        self
119    }
120}
121
122impl<C> Post for UserBuilder<'_, C, User>
123where
124    C: Api,
125{
126    type Response = freedom_models::user::User;
127
128    async fn send(self) -> Result<Self::Response, Error> {
129        let client = self.client;
130
131        let url = client.path_to_url(format!("accounts/{}/newuser", self.state.account_id))?;
132        client.post_json_map(url, self.state).await
133    }
134}