stoat-rs 0.2.5

Stoat API Wrapper
Documentation
use stoat_database::iso8601_timestamp::Timestamp;
use stoat_models::v0::{DataMemberEdit, FieldsMember, Member};

use crate::{HttpClient, error::Error};

pub struct EditMemberBuilder {
    http: HttpClient,
    server_id: String,
    member_id: String,
    data: DataMemberEdit,
}

impl EditMemberBuilder {
    pub fn new(http: HttpClient, server_id: String, member_id: String) -> Self {
        Self {
            http,
            server_id,
            member_id,
            data: DataMemberEdit {
                nickname: None,
                avatar: None,
                roles: None,
                timeout: None,
                can_publish: None,
                can_receive: None,
                voice_channel: None,
                remove: Vec::new(),
            },
        }
    }

    pub fn nickname(&mut self, nickname: Option<String>) -> &mut Self {
        if nickname.is_some() {
            self.data.nickname = nickname;
        } else {
            self.data.remove.push(FieldsMember::Nickname);
        };

        self
    }

    pub fn avatar(&mut self, avatar: Option<String>) -> &mut Self {
        if avatar.is_some() {
            self.data.avatar = avatar;
        } else {
            self.data.remove.push(FieldsMember::Avatar);
        };

        self
    }

    pub fn roles(&mut self, roles: Vec<String>) -> &mut Self {
        if !roles.is_empty() {
            self.data.roles = Some(roles);
        } else {
            self.data.remove.push(FieldsMember::Roles);
        };

        self
    }

    pub fn timeout<T: Into<Option<Timestamp>>>(&mut self, timestamp: T) -> &mut Self {
        if let Some(timestamp) = timestamp.into() {
            self.data.timeout = Some(timestamp);
        } else {
            self.data.remove.push(FieldsMember::Timeout);
        };

        self
    }

    pub fn can_publish(&mut self, can_publish: Option<bool>) -> &mut Self {
        if can_publish.is_some() {
            self.data.can_publish = can_publish;
        } else {
            self.data.remove.push(FieldsMember::CanPublish);
        };

        self
    }

    pub fn can_receive(&mut self, can_receive: Option<bool>) -> &mut Self {
        if can_receive.is_some() {
            self.data.can_receive = can_receive;
        } else {
            self.data.remove.push(FieldsMember::CanReceive);
        };

        self
    }

    pub fn voice_channel(&mut self, voice_channel: String) -> &mut Self {
        self.data.voice_channel = Some(voice_channel);

        self
    }

    pub async fn build(&self) -> Result<Member, Error> {
        self.http
            .edit_member(&self.server_id, &self.member_id, &self.data)
            .await
    }
}