use super::GetChannelMessagesConfigured;
use crate::{
client::Client,
error::Error as HttpError,
request::{validate, Pending, Request},
routing::Route,
};
use std::{
error::Error,
fmt::{Display, Formatter, Result as FmtResult},
};
use twilight_model::{
channel::Message,
id::{ChannelId, MessageId},
};
#[derive(Debug)]
pub struct GetChannelMessagesError {
kind: GetChannelMessagesErrorType,
}
impl GetChannelMessagesError {
#[must_use = "retrieving the type has no effect if left unused"]
pub const fn kind(&self) -> &GetChannelMessagesErrorType {
&self.kind
}
#[allow(clippy::unused_self)]
#[must_use = "consuming the error and retrieving the source has no effect if left unused"]
pub fn into_source(self) -> Option<Box<dyn Error + Send + Sync>> {
None
}
#[must_use = "consuming the error into its parts has no effect if left unused"]
pub fn into_parts(
self,
) -> (
GetChannelMessagesErrorType,
Option<Box<dyn Error + Send + Sync>>,
) {
(self.kind, None)
}
}
impl Display for GetChannelMessagesError {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
match &self.kind {
GetChannelMessagesErrorType::LimitInvalid { .. } => f.write_str("the limit is invalid"),
}
}
}
impl Error for GetChannelMessagesError {}
#[derive(Debug)]
#[non_exhaustive]
pub enum GetChannelMessagesErrorType {
LimitInvalid {
limit: u64,
},
}
#[derive(Default)]
struct GetChannelMessagesFields {
limit: Option<u64>,
}
pub struct GetChannelMessages<'a> {
channel_id: ChannelId,
fields: GetChannelMessagesFields,
fut: Option<Pending<'a, Vec<Message>>>,
http: &'a Client,
}
impl<'a> GetChannelMessages<'a> {
pub(crate) fn new(http: &'a Client, channel_id: ChannelId) -> Self {
Self {
channel_id,
fields: GetChannelMessagesFields::default(),
fut: None,
http,
}
}
pub fn after(self, message_id: MessageId) -> GetChannelMessagesConfigured<'a> {
GetChannelMessagesConfigured::new(
self.http,
self.channel_id,
Some(message_id),
None,
None,
self.fields.limit,
)
}
pub fn around(self, message_id: MessageId) -> GetChannelMessagesConfigured<'a> {
GetChannelMessagesConfigured::new(
self.http,
self.channel_id,
None,
Some(message_id),
None,
self.fields.limit,
)
}
pub fn before(self, message_id: MessageId) -> GetChannelMessagesConfigured<'a> {
GetChannelMessagesConfigured::new(
self.http,
self.channel_id,
None,
None,
Some(message_id),
self.fields.limit,
)
}
pub fn limit(mut self, limit: u64) -> Result<Self, GetChannelMessagesError> {
if !validate::get_channel_messages_limit(limit) {
return Err(GetChannelMessagesError {
kind: GetChannelMessagesErrorType::LimitInvalid { limit },
});
}
self.fields.limit.replace(limit);
Ok(self)
}
fn start(&mut self) -> Result<(), HttpError> {
let request = Request::from_route(Route::GetMessages {
after: None,
around: None,
before: None,
channel_id: self.channel_id.0,
limit: self.fields.limit,
});
self.fut.replace(Box::pin(self.http.request(request)));
Ok(())
}
}
poll_req!(GetChannelMessages<'_>, Vec<Message>);