Skip to main content

zulip_api/message/get_messages/
request.rs

1use serde::{Deserialize, Serialize};
2
3use crate::filter::{Anchor, Narrow};
4use crate::{field_access, impl_default, impl_display};
5
6/// Represents the request for the `Get Messages` Zulip API endpoint.
7///
8/// See [get-messages](https://zulip.com/api/get-messages) for details.
9#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
10pub struct Request {
11    #[serde(skip_serializing_if = "Option::is_none")]
12    anchor: Option<Anchor>,
13    #[serde(skip_serializing_if = "Option::is_none")]
14    include_anchor: Option<bool>,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    num_before: Option<u64>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    num_after: Option<u64>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    narrow: Option<Narrow>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    client_gravatar: Option<bool>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    apply_markdown: Option<bool>,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    message_ids: Option<Vec<u64>>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    allow_empty_topic_name: Option<bool>,
29}
30
31impl Request {
32    /// Creates a new [Request].
33    pub const fn new() -> Self {
34        Self {
35            anchor: None,
36            include_anchor: None,
37            num_before: None,
38            num_after: None,
39            narrow: None,
40            client_gravatar: None,
41            apply_markdown: None,
42            message_ids: None,
43            allow_empty_topic_name: None,
44        }
45    }
46}
47
48field_access! {
49    Request {
50        anchor: option { Anchor },
51        include_anchor: option { bool },
52        num_before: option { u64 },
53        num_after: option { u64 },
54        client_gravatar: option { bool },
55        apply_markdown: option { bool },
56        allow_empty_topic_name: option { bool },
57    }
58}
59
60field_access! {
61    Request {
62        narrow: option_ref { &Narrow, Narrow },
63    }
64}
65
66field_access! {
67    Request {
68        message_ids: option_cow_deref { [u64], Vec<u64> },
69    }
70}
71
72impl_default!(Request);
73impl_display!(Request);
74
75#[cfg(test)]
76mod tests {
77    use super::*;
78
79    #[test]
80    fn test_request_minimal() {
81        let req = Request::new();
82        let req_json = req.to_string();
83
84        assert_eq!(serde_json::to_string(&req).unwrap(), req_json);
85        assert_eq!(serde_json::from_str::<Request>(&req_json).unwrap(), req);
86    }
87
88    #[test]
89    fn test_request_full() {
90        let anchor = Anchor::Newest;
91        let include_anchor = true;
92        let num_before = 1;
93        let num_after = 2;
94        let narrow = Narrow::new();
95        let client_gravatar = true;
96        let apply_markdown = true;
97        let message_ids = vec![3u64];
98        let allow_empty_topic_name = true;
99
100        let req = Request::new()
101            .with_anchor(anchor)
102            .with_include_anchor(include_anchor)
103            .with_num_before(num_before)
104            .with_num_after(num_after)
105            .with_narrow(narrow.clone())
106            .with_client_gravatar(client_gravatar)
107            .with_apply_markdown(apply_markdown)
108            .with_message_ids(message_ids.clone())
109            .with_allow_empty_topic_name(allow_empty_topic_name);
110
111        let req_json = req.to_string();
112
113        assert_eq!(req.anchor(), Some(anchor));
114        assert_eq!(req.include_anchor(), Some(include_anchor));
115        assert_eq!(req.num_before(), Some(num_before));
116        assert_eq!(req.num_after(), Some(num_after));
117        assert_eq!(req.narrow(), Some(&narrow));
118        assert_eq!(req.client_gravatar(), Some(client_gravatar));
119        assert_eq!(req.apply_markdown(), Some(apply_markdown));
120        assert_eq!(req.message_ids(), Some(message_ids.as_ref()));
121        assert_eq!(req.allow_empty_topic_name(), Some(allow_empty_topic_name));
122
123        assert_eq!(serde_json::to_string(&req).unwrap(), req_json);
124        assert_eq!(serde_json::from_str::<Request>(&req_json).unwrap(), req);
125    }
126}