Skip to main content

stoat/builders/
edit_user.rs

1use stoat_models::v0::{DataEditUser, DataUserProfile, FieldsUser, Presence, User};
2
3use crate::{HttpClient, error::Error};
4
5pub struct EditUserBuilder {
6    http: HttpClient,
7    user_id: String,
8    data: DataEditUser,
9}
10
11impl EditUserBuilder {
12    pub fn new(http: HttpClient, user_id: String) -> Self {
13        Self {
14            http,
15            user_id,
16            data: DataEditUser {
17                display_name: None,
18                avatar: None,
19                status: None,
20                profile: None,
21                badges: None,
22                flags: None,
23                remove: Vec::new(),
24            },
25        }
26    }
27
28    pub fn display_name(&mut self, display_name: Option<String>) -> &mut Self {
29        if display_name.is_some() {
30            self.data.display_name = display_name;
31        } else {
32            self.data.remove.push(FieldsUser::DisplayName);
33        };
34
35        self
36    }
37
38    pub fn avatar(&mut self, avatar: Option<String>) -> &mut Self {
39        if avatar.is_some() {
40            self.data.avatar = avatar;
41        } else {
42            self.data.remove.push(FieldsUser::Avatar);
43        };
44
45        self
46    }
47
48    pub fn status_text(&mut self, text: Option<String>) -> &mut Self {
49        if text.is_some() {
50            self.data.status.get_or_insert_default().text = text;
51        } else {
52            self.data.remove.push(FieldsUser::StatusText);
53        };
54
55        self
56    }
57
58    pub fn status_presence(&mut self, presence: Option<Presence>) -> &mut Self {
59        if presence.is_some() {
60            self.data.status.get_or_insert_default().presence = presence;
61        } else {
62            self.data.remove.push(FieldsUser::StatusPresence);
63        };
64
65        self
66    }
67
68    pub fn profile_content(&mut self, content: Option<String>) -> &mut Self {
69        if content.is_some() {
70            self.data
71                .profile
72                .get_or_insert_with(|| DataUserProfile {
73                    content: None,
74                    background: None,
75                })
76                .content = content;
77        } else {
78            self.data.remove.push(FieldsUser::ProfileContent);
79        };
80
81        self
82    }
83
84    pub fn profile_background(&mut self, background: Option<String>) -> &mut Self {
85        if background.is_some() {
86            self.data
87                .profile
88                .get_or_insert_with(|| DataUserProfile {
89                    content: None,
90                    background: None,
91                })
92                .background = background;
93        } else {
94            self.data.remove.push(FieldsUser::ProfileBackground);
95        };
96
97        self
98    }
99
100    pub async fn build(&self) -> Result<User, Error> {
101        self.http.edit_user(&self.user_id, &self.data).await
102    }
103}