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 GetChannelMessagesConfiguredError {
kind: GetChannelMessagesConfiguredErrorType,
}
impl GetChannelMessagesConfiguredError {
#[must_use = "retrieving the type has no effect if left unused"]
pub const fn kind(&self) -> &GetChannelMessagesConfiguredErrorType {
&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,
) -> (
GetChannelMessagesConfiguredErrorType,
Option<Box<dyn Error + Send + Sync>>,
) {
(self.kind, None)
}
}
impl Display for GetChannelMessagesConfiguredError {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
match &self.kind {
GetChannelMessagesConfiguredErrorType::LimitInvalid { .. } => {
f.write_str("the limit is invalid")
}
}
}
}
impl Error for GetChannelMessagesConfiguredError {}
#[derive(Debug)]
#[non_exhaustive]
pub enum GetChannelMessagesConfiguredErrorType {
LimitInvalid {
limit: u64,
},
}
struct GetChannelMessagesConfiguredFields {
limit: Option<u64>,
}
pub struct GetChannelMessagesConfigured<'a> {
after: Option<MessageId>,
around: Option<MessageId>,
before: Option<MessageId>,
channel_id: ChannelId,
fields: GetChannelMessagesConfiguredFields,
fut: Option<Pending<'a, Vec<Message>>>,
http: &'a Client,
}
impl<'a> GetChannelMessagesConfigured<'a> {
pub(crate) fn new(
http: &'a Client,
channel_id: ChannelId,
after: Option<MessageId>,
around: Option<MessageId>,
before: Option<MessageId>,
limit: Option<u64>,
) -> Self {
Self {
after,
around,
before,
channel_id,
fields: GetChannelMessagesConfiguredFields { limit },
fut: None,
http,
}
}
pub fn limit(mut self, limit: u64) -> Result<Self, GetChannelMessagesConfiguredError> {
if !validate::get_channel_messages_limit(limit) {
return Err(GetChannelMessagesConfiguredError {
kind: GetChannelMessagesConfiguredErrorType::LimitInvalid { limit },
});
}
self.fields.limit.replace(limit);
Ok(self)
}
fn start(&mut self) -> Result<(), HttpError> {
let request = Request::from_route(Route::GetMessages {
after: self.after.map(|x| x.0),
around: self.around.map(|x| x.0),
before: self.before.map(|x| x.0),
channel_id: self.channel_id.0,
limit: self.fields.limit,
});
self.fut.replace(Box::pin(self.http.request(request)));
Ok(())
}
}
poll_req!(GetChannelMessagesConfigured<'_>, Vec<Message>);