use crate::error::Result;
use crate::{Attachment, SlackText};
use reqwest::Url;
use serde::{Serialize, Serializer};
#[derive(Serialize, Debug, Default)]
pub struct Payload {
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<SlackText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channel: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub icon_url: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub icon_emoji: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachments: Option<Vec<Attachment>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unfurl_links: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unfurl_media: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub link_names: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parse: Option<Parse>,
}
#[derive(Debug)]
pub enum Parse {
Full,
None,
}
impl Serialize for Parse {
fn serialize<S>(&self, serializer: S) -> ::std::result::Result<S::Ok, S::Error>
where
S: Serializer,
{
let st = match *self {
Parse::Full => "full",
Parse::None => "none",
};
serializer.serialize_str(st)
}
}
#[derive(Debug)]
pub struct PayloadBuilder {
inner: Result<Payload>,
}
impl Default for PayloadBuilder {
fn default() -> PayloadBuilder {
PayloadBuilder {
inner: Ok(Default::default()),
}
}
}
impl PayloadBuilder {
pub fn new() -> PayloadBuilder {
Default::default()
}
pub fn text<S: Into<SlackText>>(self, text: S) -> PayloadBuilder {
match self.inner {
Ok(mut inner) => {
inner.text = Some(text.into());
PayloadBuilder { inner: Ok(inner) }
}
_ => self,
}
}
pub fn channel<S: Into<String>>(self, channel: S) -> PayloadBuilder {
match self.inner {
Ok(mut inner) => {
inner.channel = Some(channel.into());
PayloadBuilder { inner: Ok(inner) }
}
_ => self,
}
}
pub fn username<S: Into<String>>(self, username: S) -> PayloadBuilder {
match self.inner {
Ok(mut inner) => {
inner.username = Some(username.into());
PayloadBuilder { inner: Ok(inner) }
}
_ => self,
}
}
pub fn icon_emoji<S: Into<String>>(self, icon_emoji: S) -> PayloadBuilder {
match self.inner {
Ok(mut inner) => {
inner.icon_emoji = Some(icon_emoji.into());
PayloadBuilder { inner: Ok(inner) }
}
_ => self,
}
}
url_builder_fn! {
icon_url, PayloadBuilder
}
pub fn attachments(self, attachments: Vec<Attachment>) -> PayloadBuilder {
match self.inner {
Ok(mut inner) => {
inner.attachments = Some(attachments);
PayloadBuilder { inner: Ok(inner) }
}
_ => self,
}
}
pub fn unfurl_links(self, b: bool) -> PayloadBuilder {
match self.inner {
Ok(mut inner) => {
inner.unfurl_links = Some(b);
PayloadBuilder { inner: Ok(inner) }
}
_ => self,
}
}
pub fn unfurl_media(self, b: bool) -> PayloadBuilder {
match self.inner {
Ok(mut inner) => {
inner.unfurl_media = Some(b);
PayloadBuilder { inner: Ok(inner) }
}
_ => self,
}
}
pub fn link_names(self, b: bool) -> PayloadBuilder {
match self.inner {
Ok(mut inner) => {
inner.link_names = Some(u8::from(b));
PayloadBuilder { inner: Ok(inner) }
}
_ => self,
}
}
pub fn parse(self, p: Parse) -> PayloadBuilder {
match self.inner {
Ok(mut inner) => {
inner.parse = Some(p);
PayloadBuilder { inner: Ok(inner) }
}
_ => self,
}
}
pub fn build(self) -> Result<Payload> {
self.inner
}
}