Skip to main content

stoat/builders/
fetch_messages.rs

1use 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}