mod attachment;
mod message;
pub use self::attachment::Attachment;
pub use self::message::{Message, MessageId};
use crate::api;
use af_core::prelude::*;
pub async fn permalink_to<'a>(client: &api::Client, id: &MessageId) -> Result<String> {
#[derive(Serialize)]
struct Params<'a> {
channel: &'a str,
message_ts: &'a str,
}
#[derive(Deserialize)]
struct Response {
permalink: String,
}
let params = Params { channel: &id.channel, message_ts: &id.ts };
let res = client.get::<_, Response>("chat.getPermalink", ¶ms).await?;
match res {
Ok(res) => Ok(res.permalink),
Err(err) => match err.error.as_str() {
"channel_not_found" => Err(Error::ChannelNotFound),
_ => Err(Error::Other(err)),
},
}
}
pub async fn post<'a>(
client: &api::Client,
channel: impl AsRef<str>,
message: impl Into<Message<'a>>,
) -> Result<MessageId> {
#[derive(Serialize)]
struct Request<'a> {
channel: &'a str,
#[serde(flatten)]
message: Message<'a>,
}
let req = Request { channel: channel.as_ref(), message: message.into() };
let res = client.post::<_, MessageId>("chat.postMessage", &req).await?;
match res {
Ok(id) => Ok(id),
Err(err) => match err.error.as_str() {
"channel_not_found" => Err(Error::ChannelNotFound),
"not_in_channel" => Err(Error::NotInChannel),
_ => Err(Error::Other(err)),
},
}
}
pub async fn reply<'a>(
client: &api::Client,
thread_id: &MessageId,
message: impl Into<Message<'a>>,
) -> Result<MessageId> {
#[derive(Serialize)]
struct Request<'a> {
channel: &'a str,
#[serde(flatten)]
message: Message<'a>,
thread_ts: &'a str,
}
let req =
Request { channel: &thread_id.channel, message: message.into(), thread_ts: &thread_id.ts };
let res = client.post::<_, MessageId>("chat.postMessage", &req).await?;
match res {
Ok(id) => Ok(id),
Err(err) => match err.error.as_str() {
"channel_not_found" => Err(Error::ChannelNotFound),
"not_in_channel" => Err(Error::NotInChannel),
_ => Err(Error::Other(err)),
},
}
}
#[derive(Debug, Error)]
pub enum Error {
#[error("channel not found")]
ChannelNotFound,
#[error("not in channel")]
NotInChannel,
#[error("api error: {0}")]
ApiError(#[from] api::Error),
#[error("{0:#}")]
Other(api::ErrorResponse),
}
pub type Result<T = (), E = Error> = std::result::Result<T, E>;