stoat/builders/
fetch_messages.rs1use stoat_models::v0::{
2 BulkMessageResponse, Member, Message, MessageSort, OptionsQueryMessages, User,
3};
4
5use crate::{HttpClient, error::Error};
6
7#[derive(Debug, Clone)]
8pub struct MessagesWithUsers {
9 pub messages: Vec<Message>,
10 pub users: Vec<User>,
11 pub members: Vec<Member>,
12}
13
14pub struct FetchMessagesBuilder {
15 http: HttpClient,
16 channel_id: String,
17 data: OptionsQueryMessages,
18}
19
20impl FetchMessagesBuilder {
21 pub fn new(http: HttpClient, channel_id: String) -> Self {
22 Self {
23 http,
24 channel_id,
25 data: OptionsQueryMessages {
26 limit: None,
27 before: None,
28 after: None,
29 sort: None,
30 nearby: None,
31 include_users: None,
32 },
33 }
34 }
35
36 pub fn limit(&mut self, limit: i64) -> &mut Self {
37 self.data.limit = Some(limit);
38
39 self
40 }
41
42 pub fn before(&mut self, before: String) -> &mut Self {
43 self.data.before = Some(before);
44
45 self
46 }
47
48 pub fn after(&mut self, after: String) -> &mut Self {
49 self.data.after = Some(after);
50
51 self
52 }
53
54 pub fn sort(&mut self, sort: MessageSort) -> &mut Self {
55 self.data.sort = Some(sort);
56
57 self
58 }
59
60 pub fn nearby(&mut self, nearby: String) -> &mut Self {
61 self.data.nearby = Some(nearby);
62
63 self
64 }
65
66 pub async fn build_raw(&mut self, with_users: bool) -> Result<BulkMessageResponse, Error> {
67 self.data.include_users = Some(with_users);
68
69 self.http.fetch_messages(&self.channel_id, &self.data).await
70 }
71
72 pub async fn build_with_users(&mut self) -> Result<MessagesWithUsers, Error> {
73 let bulk = self.build_raw(true).await?;
74
75 if let BulkMessageResponse::MessagesAndUsers {
76 messages,
77 users,
78 members,
79 } = bulk
80 {
81 Ok(MessagesWithUsers {
82 messages,
83 users,
84 members: members.unwrap_or_default(),
85 })
86 } else {
87 Err(Error::InternalError)
88 }
89 }
90
91 pub async fn build(&mut self) -> Result<Vec<Message>, Error> {
92 let bulk = self.build_raw(false).await?;
93
94 if let BulkMessageResponse::JustMessages(messages) = bulk {
95 Ok(messages)
96 } else {
97 Err(Error::InternalError)
98 }
99 }
100}