xmtp_content_types/
group_updated.rs1use 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() {
64 let new_member = Inbox {
65 inbox_id: rand_string::<24>(),
66 };
67 let data = GroupUpdated {
68 initiated_by_inbox_id: rand_string::<24>(),
69 added_inboxes: vec![new_member.clone()],
70 removed_inboxes: vec![],
71 metadata_field_changes: vec![],
72 left_inboxes: vec![],
73 added_admin_inboxes: vec![],
74 removed_admin_inboxes: vec![],
75 added_super_admin_inboxes: vec![],
76 removed_super_admin_inboxes: vec![],
77 };
78
79 let encoded = GroupUpdatedCodec::encode(data).unwrap();
80 assert_eq!(encoded.clone().r#type.unwrap().type_id, "group_updated");
81 assert!(!encoded.content.is_empty());
82 assert_eq!(encoded.fallback, None);
84
85 let decoded = GroupUpdatedCodec::decode(encoded).unwrap();
86 assert_eq!(decoded.added_inboxes[0], new_member);
87 }
88}