freedom_api/api/post/
user.rs1use 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}