use serde_json::builder::{ObjectBuilder, ArrayBuilder};
use model::*;
macro_rules! builder {
($(#[$attr:meta] $name:ident($inner:ty);)*) => {
$(
#[$attr]
pub struct $name($inner);
impl $name {
#[doc(hidden)]
pub fn __build<F: FnOnce($name) -> $name>(f: F, inp: $inner) -> $inner {
f($name(inp)).0
}
}
)*
}
}
builder! {
EditServer(ObjectBuilder);
EditChannel(ObjectBuilder);
EditMember(ObjectBuilder);
EditProfile(ObjectBuilder);
EditUserProfile(ObjectBuilder);
EmbedBuilder(ObjectBuilder);
EmbedFooterBuilder(ObjectBuilder);
EmbedAuthorBuilder(ObjectBuilder);
EmbedFieldsBuilder(ArrayBuilder);
}
impl EditServer {
pub fn name(self, name: &str) -> Self {
EditServer(self.0.insert("name", name))
}
pub fn region(self, region: &str) -> Self {
EditServer(self.0.insert("region", region))
}
pub fn icon(self, icon: Option<&str>) -> Self {
EditServer(self.0.insert("icon", icon))
}
pub fn afk_channel(self, channel: Option<ChannelId>) -> Self {
EditServer(self.0.insert("afk_channel_id", channel.map(|c| c.0)))
}
pub fn afk_timeout(self, timeout: u64) -> Self {
EditServer(self.0.insert("afk_timeout", timeout))
}
pub fn owner(self, owner: UserId) -> Self {
EditServer(self.0.insert("owner_id", owner.0))
}
pub fn verification_level(self, verification_level: VerificationLevel) -> Self {
EditServer(self.0.insert("verification_level", verification_level.num()))
}
pub fn splash(self, splash: Option<&str>) -> Self {
EditServer(self.0.insert("splash", splash))
}
}
impl EditChannel {
pub fn name(self, name: &str) -> Self {
EditChannel(self.0.insert("name", name))
}
pub fn topic(self, topic: &str) -> Self {
EditChannel(self.0.insert("topic", topic))
}
pub fn position(self, position: u64) -> Self {
EditChannel(self.0.insert("position", position))
}
pub fn bitrate(self, bitrate: u64) -> Self {
EditChannel(self.0.insert("bitrate", bitrate))
}
pub fn user_limit(self, user_limit: u64) -> Self {
EditChannel(self.0.insert("user_limit", user_limit))
}
}
impl EditMember {
pub fn nickname(self, nick: &str) -> Self {
EditMember(self.0.insert("nick", nick))
}
pub fn mute(self, mute: bool) -> Self {
EditMember(self.0.insert("mute", mute))
}
pub fn deaf(self, deafen: bool) -> Self {
EditMember(self.0.insert("deaf", deafen))
}
pub fn roles(self, roles: &[RoleId]) -> Self {
EditMember(self.0.insert_array("roles",
|ab| roles.iter().fold(ab, |ab, id| ab.push(id.0))))
}
pub fn channel(self, channel: ChannelId) -> Self {
EditMember(self.0.insert("channel_id", channel.0))
}
}
impl EditProfile {
pub fn username(self, username: &str) -> Self {
EditProfile(self.0.insert("username", username))
}
pub fn avatar(self, icon: Option<&str>) -> Self {
EditProfile(self.0.insert("avatar", icon))
}
}
impl EditUserProfile {
pub fn password(self, password: &str) -> Self {
EditUserProfile(self.0.insert("password", password))
}
pub fn email(self, email: &str) -> Self {
EditUserProfile(self.0.insert("email", email))
}
pub fn new_password(self, password: &str) -> Self {
EditUserProfile(self.0.insert("new_password", password))
}
pub fn username(self, username: &str) -> Self {
EditUserProfile(self.0.insert("username", username))
}
pub fn avatar(self, icon: Option<&str>) -> Self {
EditUserProfile(self.0.insert("avatar", icon))
}
}
impl EmbedBuilder {
pub fn title(self, title: &str) -> Self {
EmbedBuilder(self.0.insert("title", title))
}
pub fn description(self, description: &str) -> Self {
EmbedBuilder(self.0.insert("description", description))
}
pub fn url(self, url: &str) -> Self {
EmbedBuilder(self.0.insert("url", url))
}
pub fn timestamp(self, timestamp: &str) -> Self {
EmbedBuilder(self.0.insert("timestamp", timestamp))
}
pub fn color(self, color: u64) -> Self {
EmbedBuilder(self.0.insert("color", color))
}
pub fn footer<F: FnOnce(EmbedFooterBuilder) -> EmbedFooterBuilder>(self, f: F) -> Self {
EmbedBuilder(self.0.insert("footer", f(EmbedFooterBuilder(ObjectBuilder::new())).0.build()))
}
pub fn image(self, url: &str) -> Self {
EmbedBuilder(self.0.insert("image", ObjectBuilder::new().insert("url", url).build()))
}
pub fn thumbnail(self, url: &str) -> Self {
EmbedBuilder(self.0.insert("thumbnail", ObjectBuilder::new().insert("url", url).build()))
}
pub fn author<F: FnOnce(EmbedAuthorBuilder) -> EmbedAuthorBuilder>(self, f: F) -> Self {
EmbedBuilder(self.0.insert("author", f(EmbedAuthorBuilder(ObjectBuilder::new())).0.build()))
}
pub fn fields<F: FnOnce(EmbedFieldsBuilder) -> EmbedFieldsBuilder>(self, f: F) -> Self {
EmbedBuilder(self.0.insert("fields", f(EmbedFieldsBuilder(ArrayBuilder::new())).0.build()))
}
}
impl EmbedFooterBuilder {
pub fn text(self, text: &str) -> Self {
EmbedFooterBuilder(self.0.insert("text", text))
}
pub fn icon_url(self, icon_url: &str) -> Self {
EmbedFooterBuilder(self.0.insert("icon_url", icon_url))
}
}
impl EmbedAuthorBuilder {
pub fn name(self, name: &str) -> Self {
EmbedAuthorBuilder(self.0.insert("name", name))
}
pub fn url(self, url: &str) -> Self {
EmbedAuthorBuilder(self.0.insert("url", url))
}
pub fn icon_url(self, icon_url: &str) -> Self {
EmbedAuthorBuilder(self.0.insert("icon_url", icon_url))
}
}
impl EmbedFieldsBuilder {
pub fn field(self, name: &str, value: &str, inline: bool) -> Self {
EmbedFieldsBuilder(self.0.push(ObjectBuilder::new().insert("name", name).insert("value", value).insert("inline", inline).build()))
}
}