use serde::Serialize;
use crate::models::{events::UserField, Id, Presence, UserStatus};
#[derive(Debug, Clone, Default, Serialize)]
pub struct EditUser {
#[serde(skip_serializing_if = "Option::is_none")]
status: Option<UserStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
profile: Option<EditUserProfile>,
#[serde(skip_serializing_if = "Option::is_none")]
avatar: Option<Id>,
#[serde(skip_serializing_if = "Option::is_none")]
remove: Option<UserField>,
}
impl EditUser {
pub fn new() -> Self {
Self::default()
}
pub fn status(mut self, status: UserStatus) -> Self {
self.status = Some(status);
self
}
pub fn profile(mut self, build: impl Fn(EditUserProfile) -> EditUserProfile) -> Self {
self.profile = Some(build(EditUserProfile::default()));
self
}
pub fn avatar(mut self, id: &Id) -> Self {
self.avatar = Some(id.clone());
self
}
pub fn remove(mut self, field: UserField) -> Self {
self.remove = Some(field);
self
}
}
impl From<Presence> for EditUser {
fn from(presence: Presence) -> Self {
Self::new().status(UserStatus::presence(presence))
}
}
impl From<UserStatus> for EditUser {
fn from(status: UserStatus) -> Self {
Self::new().status(status)
}
}
impl From<EditUserProfile> for EditUser {
fn from(profile: EditUserProfile) -> Self {
Self {
profile: Some(profile),
..Default::default()
}
}
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct EditUserProfile {
#[serde(skip_serializing_if = "Option::is_none")]
content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
background: Option<Id>,
}
impl EditUserProfile {
pub fn content(mut self, content: impl Into<String>) -> Self {
self.content = Some(content.into());
self
}
pub fn background(mut self, id: &Id) -> Self {
self.background = Some(id.clone());
self
}
}