matrix_sdk_ffi/
room_member.rs

1use matrix_sdk::room::{RoomMember as SdkRoomMember, RoomMemberRole};
2use ruma::UserId;
3
4use crate::error::{ClientError, NotYetImplemented};
5
6#[derive(Clone, uniffi::Enum)]
7pub enum MembershipState {
8    /// The user is banned.
9    Ban,
10
11    /// The user has been invited.
12    Invite,
13
14    /// The user has joined.
15    Join,
16
17    /// The user has requested to join.
18    Knock,
19
20    /// The user has left.
21    Leave,
22
23    /// A custom membership state value.
24    Custom { value: String },
25}
26
27impl TryFrom<matrix_sdk::ruma::events::room::member::MembershipState> for MembershipState {
28    type Error = NotYetImplemented;
29
30    fn try_from(
31        m: matrix_sdk::ruma::events::room::member::MembershipState,
32    ) -> Result<Self, Self::Error> {
33        match m {
34            matrix_sdk::ruma::events::room::member::MembershipState::Ban => {
35                Ok(MembershipState::Ban)
36            }
37            matrix_sdk::ruma::events::room::member::MembershipState::Invite => {
38                Ok(MembershipState::Invite)
39            }
40            matrix_sdk::ruma::events::room::member::MembershipState::Join => {
41                Ok(MembershipState::Join)
42            }
43            matrix_sdk::ruma::events::room::member::MembershipState::Knock => {
44                Ok(MembershipState::Knock)
45            }
46            matrix_sdk::ruma::events::room::member::MembershipState::Leave => {
47                Ok(MembershipState::Leave)
48            }
49            matrix_sdk::ruma::events::room::member::MembershipState::_Custom(_) => {
50                Ok(MembershipState::Custom { value: m.to_string() })
51            }
52            _ => {
53                tracing::warn!("Other membership state change not yet implemented");
54                Err(NotYetImplemented)
55            }
56        }
57    }
58}
59
60#[matrix_sdk_ffi_macros::export]
61pub fn suggested_role_for_power_level(power_level: i64) -> RoomMemberRole {
62    // It's not possible to expose the constructor on the Enum through Uniffi ☹️
63    RoomMemberRole::suggested_role_for_power_level(power_level)
64}
65
66#[matrix_sdk_ffi_macros::export]
67pub fn suggested_power_level_for_role(role: RoomMemberRole) -> i64 {
68    // It's not possible to expose methods on an Enum through Uniffi ☹️
69    role.suggested_power_level()
70}
71
72/// Generates a `matrix.to` permalink to the given userID.
73#[matrix_sdk_ffi_macros::export]
74pub fn matrix_to_user_permalink(user_id: String) -> Result<String, ClientError> {
75    let user_id = UserId::parse(user_id)?;
76    Ok(user_id.matrix_to_uri().to_string())
77}
78
79#[derive(Clone, uniffi::Record)]
80pub struct RoomMember {
81    pub user_id: String,
82    pub display_name: Option<String>,
83    pub avatar_url: Option<String>,
84    pub membership: MembershipState,
85    pub is_name_ambiguous: bool,
86    pub power_level: i64,
87    pub normalized_power_level: i64,
88    pub is_ignored: bool,
89    pub suggested_role_for_power_level: RoomMemberRole,
90    pub membership_change_reason: Option<String>,
91}
92
93impl TryFrom<SdkRoomMember> for RoomMember {
94    type Error = NotYetImplemented;
95
96    fn try_from(m: SdkRoomMember) -> Result<Self, Self::Error> {
97        Ok(RoomMember {
98            user_id: m.user_id().to_string(),
99            display_name: m.display_name().map(|s| s.to_owned()),
100            avatar_url: m.avatar_url().map(|a| a.to_string()),
101            membership: m.membership().clone().try_into()?,
102            is_name_ambiguous: m.name_ambiguous(),
103            power_level: m.power_level(),
104            normalized_power_level: m.normalized_power_level(),
105            is_ignored: m.is_ignored(),
106            suggested_role_for_power_level: m.suggested_role_for_power_level(),
107            membership_change_reason: m.event().reason().map(|s| s.to_owned()),
108        })
109    }
110}