use crate::{builder_methods, serde_for_bitflags};
use serde::{Deserialize, Serialize};
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
#[derive(Clone, Debug, Default, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct User {
pub id: u64,
pub username: String,
pub discriminator: u16,
pub avatar: Option<String>,
pub banner: Option<String>,
pub bio: Option<String>,
pub flags: UserFlags,
}
bitflags::bitflags! {
#[derive(Default)]
pub struct UserFlags: u32 {
const BOT = 1 << 0;
}
}
serde_for_bitflags!(u32: UserFlags);
impl User {
builder_methods! {
id: u64 => set_id,
username: String => set_username,
discriminator: u16 => set_discriminator,
avatar: String => set_avatar + Some,
banner: String => set_banner + Some,
bio: String => set_bio + Some,
flags: UserFlags => set_flags,
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct GuildFolderInfo {
pub name: String,
pub color: u32,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct GuildFolder {
pub path: Option<Vec<GuildFolderInfo>>,
pub guilds: Vec<u64>,
}
#[derive(Clone, Debug, Default, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct ClientUser {
#[serde(flatten)]
pub user: User,
#[cfg_attr(feature = "openapi", schema(format = "email"))]
pub email: Option<String>,
#[serde(skip)]
#[cfg(feature = "db")]
pub password: Option<String>,
pub relationships: Vec<Relationship>,
}
impl std::ops::Deref for ClientUser {
type Target = User;
fn deref(&self) -> &Self::Target {
&self.user
}
}
impl std::ops::DerefMut for ClientUser {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.user
}
}
impl ClientUser {
builder_methods! {
email: String => set_email + Some,
relationships: Vec<Relationship> => set_relationships,
}
}
#[derive(Copy, Clone, Debug, Default, Deserialize, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub enum RelationshipType {
#[default]
Friend,
Blocked,
}
#[derive(Clone, Debug, Default, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct Relationship {
pub id: u64,
#[serde(rename = "type")]
pub kind: RelationshipType,
}