Skip to main content

zulip_api/message/
submessage.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{field_access, impl_default, impl_display};
4
5use super::MessageType;
6
7/// Represents a message returned by the Zulip API server.
8#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
9pub struct Submessage {
10    msg_type: MessageType,
11    content: String,
12    message_id: u64,
13    sender_id: u64,
14    id: u64,
15}
16
17impl Submessage {
18    /// Creates a new [Submessage].
19    pub const fn new() -> Self {
20        Self {
21            msg_type: MessageType::new(),
22            content: String::new(),
23            message_id: 0,
24            sender_id: 0,
25            id: 0,
26        }
27    }
28}
29
30field_access! {
31    Submessage {
32        msg_type: MessageType,
33        message_id: u64,
34        sender_id: u64,
35        id: u64,
36    }
37}
38
39field_access! {
40    Submessage {
41        content: cow { str },
42    }
43}
44
45impl_default!(Submessage);
46impl_display!(Submessage);
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51
52    #[test]
53    fn test_sub_message() {
54        let msg_type = MessageType::Channel;
55        let content = "content";
56        let message_id = 1;
57        let sender_id = 2;
58        let id = 3;
59
60        let sub = Submessage::new()
61            .with_msg_type(msg_type)
62            .with_content(content)
63            .with_message_id(message_id)
64            .with_sender_id(sender_id)
65            .with_id(id);
66
67        let sub_json = sub.to_string();
68
69        assert_eq!(sub.msg_type(), msg_type);
70        assert_eq!(sub.content(), content);
71        assert_eq!(sub.message_id(), message_id);
72        assert_eq!(sub.sender_id(), sender_id);
73        assert_eq!(sub.id(), id);
74
75        assert_eq!(serde_json::to_string(&sub).unwrap(), sub_json);
76        assert_eq!(serde_json::from_str::<Submessage>(&sub_json).unwrap(), sub);
77    }
78}