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