stoat/builders/
edit_member.rs1use 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}