Skip to main content

xmtp_content_types/
group_updated.rs

1use std::collections::HashMap;
2
3use prost::Message;
4
5use xmtp_proto::xmtp::mls::message_contents::{ContentTypeId, EncodedContent, GroupUpdated};
6
7use super::{CodecError, ContentCodec};
8
9pub struct GroupUpdatedCodec {}
10
11impl GroupUpdatedCodec {
12    const AUTHORITY_ID: &'static str = "xmtp.org";
13    pub const TYPE_ID: &'static str = "group_updated";
14    pub const MAJOR_VERSION: u32 = 1;
15    pub const MINOR_VERSION: u32 = 0;
16}
17
18impl ContentCodec<GroupUpdated> for GroupUpdatedCodec {
19    fn content_type() -> ContentTypeId {
20        ContentTypeId {
21            authority_id: GroupUpdatedCodec::AUTHORITY_ID.to_string(),
22            type_id: GroupUpdatedCodec::TYPE_ID.to_string(),
23            version_major: GroupUpdatedCodec::MAJOR_VERSION,
24            version_minor: GroupUpdatedCodec::MINOR_VERSION,
25        }
26    }
27
28    fn encode(data: GroupUpdated) -> Result<EncodedContent, CodecError> {
29        let mut buf = Vec::new();
30        data.encode(&mut buf)
31            .map_err(|e| CodecError::Encode(e.to_string()))?;
32
33        Ok(EncodedContent {
34            r#type: Some(GroupUpdatedCodec::content_type()),
35            parameters: HashMap::new(),
36            fallback: None,
37            compression: None,
38            content: buf,
39        })
40    }
41
42    fn decode(content: EncodedContent) -> Result<GroupUpdated, CodecError> {
43        let decoded = GroupUpdated::decode(content.content.as_slice())
44            .map_err(|e| CodecError::Decode(e.to_string()))?;
45
46        Ok(decoded)
47    }
48
49    fn should_push() -> bool {
50        false
51    }
52}
53
54#[cfg(test)]
55pub(crate) mod tests {
56    use super::*;
57    use xmtp_common::rand_string;
58    use xmtp_proto::xmtp::mls::message_contents::{GroupUpdated, group_updated::Inbox};
59
60    #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
61    #[cfg_attr(not(target_arch = "wasm32"), test)]
62    fn test_encode_decode() {
63        let new_member = Inbox {
64            inbox_id: rand_string::<24>(),
65        };
66        let data = GroupUpdated {
67            initiated_by_inbox_id: rand_string::<24>(),
68            added_inboxes: vec![new_member.clone()],
69            removed_inboxes: vec![],
70            metadata_field_changes: vec![],
71            left_inboxes: vec![],
72            added_admin_inboxes: vec![],
73            removed_admin_inboxes: vec![],
74            added_super_admin_inboxes: vec![],
75            removed_super_admin_inboxes: vec![],
76        };
77
78        let encoded = GroupUpdatedCodec::encode(data).unwrap();
79        assert_eq!(encoded.clone().r#type.unwrap().type_id, "group_updated");
80        assert!(!encoded.content.is_empty());
81
82        let decoded = GroupUpdatedCodec::decode(encoded).unwrap();
83        assert_eq!(decoded.added_inboxes[0], new_member);
84    }
85}