use crate::internal::prelude::*;
use crate::http::AttachmentType;
use crate::model::channel::ReactionType;
use super::CreateEmbed;
use super::CreateAllowedMentions;
use crate::utils;
use std::collections::HashMap;
#[derive(Clone, Debug)]
pub struct CreateMessage<'a>(pub HashMap<&'static str, Value>, pub Option<Vec<ReactionType>>, pub Vec<AttachmentType<'a>>);
impl<'a> CreateMessage<'a> {
#[inline]
pub fn content<D: ToString>(&mut self, content: D) -> &mut Self {
self._content(content.to_string())
}
fn _content(&mut self, content: String) -> &mut Self {
self.0.insert("content", Value::String(content));
self
}
pub fn embed<F>(&mut self, f: F) -> &mut Self
where F: FnOnce(&mut CreateEmbed) -> &mut CreateEmbed {
let mut embed = CreateEmbed::default();
f(&mut embed);
self.set_embed(embed)
}
pub fn set_embed(&mut self, embed: CreateEmbed) -> &mut Self {
let map = utils::hashmap_to_json_map(embed.0);
let embed = Value::Object(map);
self.0.insert("embed", embed);
self
}
pub fn tts(&mut self, tts: bool) -> &mut Self {
self.0.insert("tts", Value::Bool(tts));
self
}
#[inline]
pub fn reactions<R: Into<ReactionType>, It: IntoIterator<Item=R>>(&mut self, reactions: It) -> &mut Self {
self._reactions(reactions.into_iter().map(Into::into).collect());
self
}
fn _reactions(&mut self, reactions: Vec<ReactionType>) {
self.1 = Some(reactions);
}
pub fn add_file<T: Into<AttachmentType<'a>>>(&mut self, file: T) -> &mut Self {
self.2.push(file.into());
self
}
pub fn add_files<T: Into<AttachmentType<'a>>, It: IntoIterator<Item=T>>(&mut self, files: It) -> &mut Self {
self.2.extend(files.into_iter().map(|f| f.into()));
self
}
pub fn files<T: Into<AttachmentType<'a>>, It: IntoIterator<Item=T>>(&mut self, files: It) -> &mut Self {
self.2 = files.into_iter().map(|f| f.into()).collect();
self
}
pub fn allowed_mentions<F>(&mut self, f: F) -> &mut Self
where F: FnOnce(&mut CreateAllowedMentions) -> &mut CreateAllowedMentions {
let mut allowed_mentions = CreateAllowedMentions::default();
f(&mut allowed_mentions);
let map = utils::hashmap_to_json_map(allowed_mentions.0);
let allowed_mentions = Value::Object(map);
self.0.insert("allowed_mentions", allowed_mentions);
self
}
}
impl<'a> Default for CreateMessage<'a> {
fn default() -> CreateMessage<'a> {
let mut map = HashMap::new();
map.insert("tts", Value::Bool(false));
CreateMessage(map, None, Vec::new())
}
}