diff --git a/rust/message-backup/src/backup/chat.rs b/rust/message-backup/src/backup/chat.rs index 8f379d30..5f5733c7 100644 --- a/rust/message-backup/src/backup/chat.rs +++ b/rust/message-backup/src/backup/chat.rs @@ -32,7 +32,7 @@ pub(crate) mod chat_style; mod gift_badge; use gift_badge::*; -mod group; +pub(crate) mod group; use group::*; mod link; diff --git a/rust/message-backup/src/backup/chat/group.rs b/rust/message-backup/src/backup/chat/group.rs index fd80d1a3..b354d105 100644 --- a/rust/message-backup/src/backup/chat/group.rs +++ b/rust/message-backup/src/backup/chat/group.rs @@ -14,6 +14,7 @@ use libsignal_protocol::{Aci, Pni, ServiceId}; use macro_rules_attribute::macro_rules_derive; use protobuf::{EnumOrUnknown, Message}; +use crate::backup::serialize::UnorderedList; use crate::backup::time::Duration; use crate::backup::{serialize, uuid_bytes_to_aci}; use crate::proto::backup::{ @@ -190,7 +191,7 @@ pub enum GroupChatUpdate { GroupInvitationRevokedUpdate { #[serde(serialize_with = "serialize::optional_service_id_as_string")] updaterAci: Option, - invitees: Vec, + invitees: UnorderedList, }, GroupJoinRequestUpdate { #[serde(serialize_with = "serialize::service_id_as_string")] @@ -365,7 +366,7 @@ impl ValidateFrom> for AccessLevel { } } -impl ValidateFrom> for Vec { +impl ValidateFrom> for UnorderedList { fn validate_from( invitees: Vec, ) -> Result { @@ -514,7 +515,7 @@ mod test { ] } - fn validated_invitees() -> Vec { + fn validated_invitees() -> UnorderedList { vec![ Invitee { inviter: None, @@ -527,6 +528,7 @@ mod test { invitee_aci: None, }, ] + .into() } fn invitee_invalid_aci() -> Vec { @@ -556,11 +558,11 @@ mod test { #[test_case(ACI.service_id_binary(), Ok(ServiceId::Aci(ACI)))] #[test_case(vec![], Err::(InvalidServiceId))] #[test_case(valid_invitees(), Ok(validated_invitees()))] - #[test_case(vec![], Ok(vec![]))] - #[test_case(invitee_invalid_aci(), Err::,_>(InvalidInvitee(InviteeError::InviteeAci)))] + #[test_case(vec![], Ok(UnorderedList::from(vec![])))] + #[test_case(invitee_invalid_aci(), Err::,_>(InvalidInvitee(InviteeError::InviteeAci)))] #[test_case( invitee_pni_service_id_binary(), - Err::, _>(InvalidInvitee(InviteeError::InviteePni)) + Err::, _>(InvalidInvitee(InviteeError::InviteePni)) )] #[test_case( EnumOrUnknown::default(), diff --git a/rust/message-backup/src/backup/serialize.rs b/rust/message-backup/src/backup/serialize.rs index 4fbc2a05..d28858de 100644 --- a/rust/message-backup/src/backup/serialize.rs +++ b/rust/message-backup/src/backup/serialize.rs @@ -11,6 +11,7 @@ use uuid::Uuid; use crate::backup::account_data::AccountData; use crate::backup::call::AdHocCall; +use crate::backup::chat::group::Invitee; use crate::backup::chat::text::{TextEffect, TextRange}; use crate::backup::chat::{ChatData, OutgoingSend}; use crate::backup::frame::RecipientId; @@ -250,6 +251,16 @@ impl SerializeOrder for OutgoingSend { } } +impl SerializeOrder for Invitee { + fn serialize_cmp(&self, other: &Self) -> std::cmp::Ordering { + (self.invitee_aci, self.invitee_pni, self.inviter).cmp(&( + other.invitee_aci, + other.invitee_pni, + other.inviter, + )) + } +} + impl serde::Serialize for proto::contact_attachment::Name { fn serialize(&self, serializer: S) -> Result where