matrix_sdk_ffi/
room_member.rs1use 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 Ban,
10
11 Invite,
13
14 Join,
16
17 Knock,
19
20 Leave,
22
23 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 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 role.suggested_power_level()
70}
71
72#[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}