xmtp_db/encrypted_store/group/
convert.rs

1use super::*;
2use xmtp_proto::ConversionError;
3use xmtp_proto::xmtp::device_sync::group_backup::{ConversationTypeSave, GroupMembershipStateSave};
4
5use xmtp_proto::xmtp::mls::message_contents::ConversationType as ConversationTypeProto;
6
7impl TryFrom<GroupMembershipStateSave> for GroupMembershipState {
8    type Error = ConversionError;
9    fn try_from(value: GroupMembershipStateSave) -> Result<Self, Self::Error> {
10        let membership_state = match value {
11            GroupMembershipStateSave::Allowed => Self::Allowed,
12            GroupMembershipStateSave::Pending => Self::Pending,
13            GroupMembershipStateSave::Rejected => Self::Rejected,
14            GroupMembershipStateSave::Restored => Self::Restored,
15            GroupMembershipStateSave::PendingRemove => Self::PendingRemove,
16            _ => {
17                return Err(ConversionError::Unspecified("group_membership_state"));
18            }
19        };
20        Ok(membership_state)
21    }
22}
23
24impl TryFrom<ConversationTypeSave> for ConversationType {
25    type Error = ConversionError;
26    fn try_from(value: ConversationTypeSave) -> Result<Self, Self::Error> {
27        let conversation_type = match value {
28            ConversationTypeSave::Dm => Self::Dm,
29            ConversationTypeSave::Group => Self::Group,
30            ConversationTypeSave::Sync => Self::Sync,
31            ConversationTypeSave::Unspecified => {
32                return Err(ConversionError::Unspecified("conversation_type"));
33            }
34        };
35        Ok(conversation_type)
36    }
37}
38
39impl From<GroupMembershipState> for GroupMembershipStateSave {
40    fn from(value: GroupMembershipState) -> Self {
41        match value {
42            GroupMembershipState::Allowed => Self::Allowed,
43            GroupMembershipState::Pending => Self::Pending,
44            GroupMembershipState::Rejected => Self::Rejected,
45            GroupMembershipState::Restored => Self::Restored,
46            GroupMembershipState::PendingRemove => Self::PendingRemove,
47        }
48    }
49}
50impl From<ConversationType> for ConversationTypeSave {
51    fn from(value: ConversationType) -> Self {
52        match value {
53            ConversationType::Dm => Self::Dm,
54            ConversationType::Group => Self::Group,
55            ConversationType::Sync => Self::Sync,
56            ConversationType::Oneshot => Self::Unspecified,
57        }
58    }
59}
60
61/**
62 * XMTP supports the following types of conversation
63 *
64 * *Group*: A conversation with 1->N members and complex permissions and roles
65 * *DM*: A conversation between 2 members with simplified permissions
66 * *Sync*: A conversation between all the devices of a single member with simplified permissions
67 */
68impl From<ConversationType> for ConversationTypeProto {
69    fn from(value: ConversationType) -> Self {
70        match value {
71            ConversationType::Group => Self::Group,
72            ConversationType::Dm => Self::Dm,
73            ConversationType::Sync => Self::Sync,
74            ConversationType::Oneshot => Self::Oneshot,
75        }
76    }
77}
78
79impl TryFrom<i32> for ConversationType {
80    type Error = xmtp_proto::ConversionError;
81
82    fn try_from(value: i32) -> Result<Self, Self::Error> {
83        Ok(match value {
84            1 => Self::Group,
85            2 => Self::Dm,
86            3 => Self::Sync,
87            4 => Self::Oneshot,
88            n => {
89                return Err(ConversionError::InvalidValue {
90                    item: "ConversationType",
91                    expected: "number between 1 - 4",
92                    got: n.to_string(),
93                });
94            }
95        })
96    }
97}