11use matrix_sdk:: room:: { RoomMember as SdkRoomMember , RoomMemberRole } ;
2- use ruma:: UserId ;
2+ use ruma:: { events :: room :: power_levels :: UserPowerLevel , UserId } ;
33
44use crate :: error:: { ClientError , NotYetImplemented } ;
55
@@ -57,16 +57,22 @@ impl TryFrom<matrix_sdk::ruma::events::room::member::MembershipState> for Member
5757 }
5858}
5959
60+ /// Get the suggested role for the given power level.
61+ ///
62+ /// Returns an error if the value of the power level is out of range for numbers
63+ /// accepted in canonical JSON.
6064#[ matrix_sdk_ffi_macros:: export]
61- pub fn suggested_role_for_power_level ( power_level : i64 ) -> RoomMemberRole {
65+ pub fn suggested_role_for_power_level (
66+ power_level : PowerLevel ,
67+ ) -> Result < RoomMemberRole , ClientError > {
6268 // It's not possible to expose the constructor on the Enum through Uniffi ☹️
63- RoomMemberRole :: suggested_role_for_power_level ( power_level)
69+ Ok ( RoomMemberRole :: suggested_role_for_power_level ( power_level. try_into ( ) ? ) )
6470}
6571
6672#[ matrix_sdk_ffi_macros:: export]
67- pub fn suggested_power_level_for_role ( role : RoomMemberRole ) -> i64 {
73+ pub fn suggested_power_level_for_role ( role : RoomMemberRole ) -> PowerLevel {
6874 // It's not possible to expose methods on an Enum through Uniffi ☹️
69- role. suggested_power_level ( )
75+ role. suggested_power_level ( ) . into ( )
7076}
7177
7278/// Generates a `matrix.to` permalink to the given userID.
@@ -83,8 +89,8 @@ pub struct RoomMember {
8389 pub avatar_url : Option < String > ,
8490 pub membership : MembershipState ,
8591 pub is_name_ambiguous : bool ,
86- pub power_level : i64 ,
87- pub normalized_power_level : i64 ,
92+ pub power_level : PowerLevel ,
93+ pub normalized_power_level : PowerLevel ,
8894 pub is_ignored : bool ,
8995 pub suggested_role_for_power_level : RoomMemberRole ,
9096 pub membership_change_reason : Option < String > ,
@@ -100,8 +106,8 @@ impl TryFrom<SdkRoomMember> for RoomMember {
100106 avatar_url : m. avatar_url ( ) . map ( |a| a. to_string ( ) ) ,
101107 membership : m. membership ( ) . clone ( ) . try_into ( ) ?,
102108 is_name_ambiguous : m. name_ambiguous ( ) ,
103- power_level : m. power_level ( ) ,
104- normalized_power_level : m. normalized_power_level ( ) ,
109+ power_level : m. power_level ( ) . into ( ) ,
110+ normalized_power_level : m. normalized_power_level ( ) . into ( ) ,
105111 is_ignored : m. is_ignored ( ) ,
106112 suggested_role_for_power_level : m. suggested_role_for_power_level ( ) ,
107113 membership_change_reason : m. event ( ) . reason ( ) . map ( |s| s. to_owned ( ) ) ,
@@ -130,3 +136,40 @@ impl TryFrom<matrix_sdk::room::RoomMemberWithSenderInfo> for RoomMemberWithSende
130136 } )
131137 }
132138}
139+
140+ #[ derive( Clone , uniffi:: Enum ) ]
141+ pub enum PowerLevel {
142+ /// The user is a room creator and has infinite power level.
143+ ///
144+ /// This power level was introduced in room version 12.
145+ Infinite ,
146+
147+ /// The user has the given power level.
148+ Value { value : i64 } ,
149+ }
150+
151+ impl From < UserPowerLevel > for PowerLevel {
152+ fn from ( value : UserPowerLevel ) -> Self {
153+ match value {
154+ UserPowerLevel :: Infinite => Self :: Infinite ,
155+ UserPowerLevel :: Int ( value) => Self :: Value { value : value. into ( ) } ,
156+ _ => unimplemented ! ( ) ,
157+ }
158+ }
159+ }
160+
161+ impl TryFrom < PowerLevel > for UserPowerLevel {
162+ type Error = ClientError ;
163+
164+ fn try_from ( value : PowerLevel ) -> Result < Self , Self :: Error > {
165+ Ok ( match value {
166+ PowerLevel :: Infinite => Self :: Infinite ,
167+ PowerLevel :: Value { value } => {
168+ Self :: Int ( value. try_into ( ) . map_err ( |err| ClientError :: Generic {
169+ msg : "Power level is out of range" . to_owned ( ) ,
170+ details : Some ( format ! ( "{err:?}" ) ) ,
171+ } ) ?)
172+ }
173+ } )
174+ }
175+ }
0 commit comments