Skip to main content

stoat/builders/
edit_member.rs

1use stoat_database::iso8601_timestamp::Timestamp;
2use stoat_models::v0::{DataMemberEdit, FieldsMember, Member};
3
4use crate::{HttpClient, error::Error};
5
6pub struct EditMemberBuilder {
7    http: HttpClient,
8    server_id: String,
9    member_id: String,
10    data: DataMemberEdit,
11}
12
13impl EditMemberBuilder {
14    pub fn new(http: HttpClient, server_id: String, member_id: String) -> Self {
15        Self {
16            http,
17            server_id,
18            member_id,
19            data: DataMemberEdit {
20                nickname: None,
21                avatar: None,
22                roles: None,
23                timeout: None,
24                can_publish: None,
25                can_receive: None,
26                voice_channel: None,
27                remove: Vec::new(),
28            },
29        }
30    }
31
32    pub fn nickname(&mut self, nickname: Option<String>) -> &mut Self {
33        if nickname.is_some() {
34            self.data.nickname = nickname;
35        } else {
36            self.data.remove.push(FieldsMember::Nickname);
37        };
38
39        self
40    }
41
42    pub fn avatar(&mut self, avatar: Option<String>) -> &mut Self {
43        if avatar.is_some() {
44            self.data.avatar = avatar;
45        } else {
46            self.data.remove.push(FieldsMember::Avatar);
47        };
48
49        self
50    }
51
52    pub fn roles(&mut self, roles: Vec<String>) -> &mut Self {
53        if !roles.is_empty() {
54            self.data.roles = Some(roles);
55        } else {
56            self.data.remove.push(FieldsMember::Roles);
57        };
58
59        self
60    }
61
62    pub fn timeout<T: Into<Option<Timestamp>>>(&mut self, timestamp: T) -> &mut Self {
63        if let Some(timestamp) = timestamp.into() {
64            self.data.timeout = Some(timestamp);
65        } else {
66            self.data.remove.push(FieldsMember::Timeout);
67        };
68
69        self
70    }
71
72    pub fn can_publish(&mut self, can_publish: Option<bool>) -> &mut Self {
73        if can_publish.is_some() {
74            self.data.can_publish = can_publish;
75        } else {
76            self.data.remove.push(FieldsMember::CanPublish);
77        };
78
79        self
80    }
81
82    pub fn can_receive(&mut self, can_receive: Option<bool>) -> &mut Self {
83        if can_receive.is_some() {
84            self.data.can_receive = can_receive;
85        } else {
86            self.data.remove.push(FieldsMember::CanReceive);
87        };
88
89        self
90    }
91
92    pub fn voice_channel(&mut self, voice_channel: String) -> &mut Self {
93        self.data.voice_channel = Some(voice_channel);
94
95        self
96    }
97
98    pub async fn build(&self) -> Result<Member, Error> {
99        self.http
100            .edit_member(&self.server_id, &self.member_id, &self.data)
101            .await
102    }
103}