@@ -52,6 +52,7 @@ use ruma::{
5252 get_capabilities:: { self , Capabilities } ,
5353 get_supported_versions,
5454 } ,
55+ error:: ErrorKind ,
5556 filter:: { create_filter:: v3:: Request as FilterUploadRequest , FilterDefinition } ,
5657 knock:: knock_room,
5758 membership:: { join_room_by_id, join_room_by_id_or_alias} ,
@@ -1038,6 +1039,27 @@ impl Client {
10381039 self . send ( request, None ) . await
10391040 }
10401041
1042+ /// Checks if a room alias is not in use yet.
1043+ ///
1044+ /// Returns:
1045+ /// - `Ok(true)` if the room alias is available.
1046+ /// - `Ok(false)` if it's not (the resolve alias request returned a `404`
1047+ /// status code).
1048+ /// - An `Err` otherwise.
1049+ pub async fn is_room_alias_available ( & self , alias : & RoomAliasId ) -> HttpResult < bool > {
1050+ match self . resolve_room_alias ( alias) . await {
1051+ // The room alias was resolved, so it's already in use.
1052+ Ok ( _) => Ok ( false ) ,
1053+ Err ( error) => {
1054+ match error. client_api_error_kind ( ) {
1055+ // The room alias wasn't found, so it's available.
1056+ Some ( ErrorKind :: NotFound ) => Ok ( true ) ,
1057+ _ => Err ( error) ,
1058+ }
1059+ }
1060+ }
1061+ }
1062+
10411063 /// Update the homeserver from the login response well-known if needed.
10421064 ///
10431065 /// # Arguments
@@ -2328,7 +2350,7 @@ pub(crate) mod tests {
23282350 api:: { client:: room:: create_room:: v3:: Request as CreateRoomRequest , MatrixVersion } ,
23292351 assign,
23302352 events:: ignored_user_list:: IgnoredUserListEventContent ,
2331- owned_room_id, room_id, RoomId , ServerName , UserId ,
2353+ owned_room_id, room_alias_id , room_id, RoomId , ServerName , UserId ,
23322354 } ;
23332355 use serde_json:: json;
23342356 use tokio:: {
@@ -2346,8 +2368,8 @@ pub(crate) mod tests {
23462368 client:: WeakClient ,
23472369 config:: { RequestConfig , SyncSettings } ,
23482370 test_utils:: {
2349- logged_in_client, no_retry_test_client , set_client_session , test_client_builder ,
2350- test_client_builder_with_server,
2371+ logged_in_client, mocks :: MatrixMockServer , no_retry_test_client , set_client_session ,
2372+ test_client_builder , test_client_builder_with_server,
23512373 } ,
23522374 Error ,
23532375 } ;
@@ -2915,4 +2937,42 @@ pub(crate) mod tests {
29152937 . await
29162938 . unwrap_err ( ) ;
29172939 }
2940+
2941+ #[ async_test]
2942+ async fn test_is_room_alias_available_if_alias_is_not_resolved ( ) {
2943+ let server = MatrixMockServer :: new ( ) . await ;
2944+ let client = logged_in_client ( Some ( server. server ( ) . uri ( ) ) ) . await ;
2945+
2946+ server. mock_room_directory_resolve_alias ( ) . not_found ( ) . expect ( 1 ) . mount ( ) . await ;
2947+
2948+ let ret = client. is_room_alias_available ( room_alias_id ! ( "#some_alias:matrix.org" ) ) . await ;
2949+ assert_matches ! ( ret, Ok ( true ) ) ;
2950+ }
2951+
2952+ #[ async_test]
2953+ async fn test_is_room_alias_available_if_alias_is_resolved ( ) {
2954+ let server = MatrixMockServer :: new ( ) . await ;
2955+ let client = logged_in_client ( Some ( server. server ( ) . uri ( ) ) ) . await ;
2956+
2957+ server
2958+ . mock_room_directory_resolve_alias ( )
2959+ . ok ( "!some_room_id:matrix.org" , Vec :: new ( ) )
2960+ . expect ( 1 )
2961+ . mount ( )
2962+ . await ;
2963+
2964+ let ret = client. is_room_alias_available ( room_alias_id ! ( "#some_alias:matrix.org" ) ) . await ;
2965+ assert_matches ! ( ret, Ok ( false ) ) ;
2966+ }
2967+
2968+ #[ async_test]
2969+ async fn test_is_room_alias_available_if_error_found ( ) {
2970+ let server = MatrixMockServer :: new ( ) . await ;
2971+ let client = logged_in_client ( Some ( server. server ( ) . uri ( ) ) ) . await ;
2972+
2973+ server. mock_room_directory_resolve_alias ( ) . error500 ( ) . expect ( 1 ) . mount ( ) . await ;
2974+
2975+ let ret = client. is_room_alias_available ( room_alias_id ! ( "#some_alias:matrix.org" ) ) . await ;
2976+ assert_matches ! ( ret, Err ( _) ) ;
2977+ }
29182978}
0 commit comments