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() {
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}