Skip to content

Commit b5ce7e7

Browse files
committed
Merge branch 'tags'
2 parents c9c03fd + 535d1ec commit b5ce7e7

File tree

3 files changed

+65
-54
lines changed

3 files changed

+65
-54
lines changed

crates/matrix-sdk/src/error.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ use ruma::{
3333
},
3434
error::{FromHttpResponseError, IntoHttpError, MatrixError as RumaApiError, ServerError},
3535
},
36+
events::tag::InvalidUserTagName,
3637
identifiers::Error as IdentifierError,
3738
};
3839
use serde_json::Error as JsonError;
@@ -157,6 +158,10 @@ pub enum Error {
157158
#[cfg(feature = "qrcode")]
158159
#[error(transparent)]
159160
QrCodeScanError(#[from] ScanError),
161+
162+
/// An error encountered when trying to parse a user tag name.
163+
#[error(transparent)]
164+
UserTagName(#[from] InvalidUserTagName),
160165
}
161166

162167
/// Error for the room key importing functionality.

crates/matrix-sdk/src/room/common.rs

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ use ruma::{
77
membership::{get_member_events, join_room_by_id, leave_room},
88
message::get_message_events,
99
room::get_room_event,
10+
tag::{create_tag, delete_tag},
1011
},
1112
events::{
12-
room::history_visibility::HistoryVisibility, AnyStateEvent, AnySyncStateEvent, EventType,
13+
room::history_visibility::HistoryVisibility,
14+
tag::{TagInfo, TagName},
15+
AnyStateEvent, AnySyncStateEvent, EventType,
1316
},
1417
serde::Raw,
1518
EventId, UserId,
@@ -18,7 +21,7 @@ use ruma::{
1821
use crate::{
1922
media::{MediaFormat, MediaRequest, MediaType},
2023
room::RoomType,
21-
BaseRoom, Client, Result, RoomMember,
24+
BaseRoom, Client, HttpError, HttpResult, Result, RoomMember,
2225
};
2326

2427
/// A struct containing methods that are common for Joined, Invited and Left
@@ -444,4 +447,57 @@ impl Common {
444447

445448
Ok(true)
446449
}
450+
451+
/// Adds a tag to the room, or updates it if it already exists.
452+
///
453+
/// Returns the [`create_tag::Response`] from the server.
454+
///
455+
/// # Arguments
456+
/// * `tag` - The tag to add or update.
457+
///
458+
/// * `tag_info` - Information about the tag, generally containing the
459+
/// `order` parameter.
460+
///
461+
/// # Example
462+
///
463+
/// ```no_run
464+
/// # use std::str::FromStr;
465+
/// # use ruma::events::tag::{TagInfo, TagName, UserTagName};
466+
/// # futures::executor::block_on(async {
467+
/// # let homeserver = url::Url::parse("http://localhost:8080")?;
468+
/// # let mut client = matrix_sdk::Client::new(homeserver)?;
469+
/// # let room_id = matrix_sdk::ruma::room_id!("!test:localhost");
470+
/// use matrix_sdk::ruma::events::tag::TagInfo;
471+
///
472+
/// if let Some(room) = client.get_joined_room(&room_id) {
473+
/// let mut tag_info = TagInfo::new();
474+
/// tag_info.order = Some(0.9);
475+
/// let user_tag = UserTagName::from_str("u.work")?;
476+
///
477+
/// room.set_tag(TagName::User(user_tag), tag_info ).await?;
478+
/// }
479+
/// # Result::<_, matrix_sdk::Error>::Ok(()) });
480+
/// ```
481+
pub async fn set_tag(
482+
&self,
483+
tag: TagName,
484+
tag_info: TagInfo,
485+
) -> HttpResult<create_tag::Response> {
486+
let user_id = self.client.user_id().await.ok_or(HttpError::AuthenticationRequired)?;
487+
let request =
488+
create_tag::Request::new(&user_id, self.inner.room_id(), tag.as_ref(), tag_info);
489+
self.client.send(request, None).await
490+
}
491+
492+
/// Removes a tag from the room.
493+
///
494+
/// Returns the [`delete_tag::Response`] from the server.
495+
///
496+
/// # Arguments
497+
/// * `tag` - The tag to remove.
498+
pub async fn remove_tag(&self, tag: TagName) -> HttpResult<delete_tag::Response> {
499+
let user_id = self.client.user_id().await.ok_or(HttpError::AuthenticationRequired)?;
500+
let request = delete_tag::Request::new(&user_id, self.inner.room_id(), tag.as_ref());
501+
self.client.send(request, None).await
502+
}
447503
}

crates/matrix-sdk/src/room/joined.rs

Lines changed: 2 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,10 @@ use ruma::{
2121
receipt::create_receipt,
2222
redact::redact_event,
2323
state::send_state_event,
24-
tag::{create_tag, delete_tag},
2524
typing::create_typing_event::{Request as TypingRequest, Typing},
2625
},
2726
assign,
28-
events::{
29-
room::message::RoomMessageEventContent, tag::TagInfo, MessageEventContent,
30-
StateEventContent,
31-
},
27+
events::{room::message::RoomMessageEventContent, MessageEventContent, StateEventContent},
3228
receipt::ReceiptType,
3329
serde::Raw,
3430
EventId, UserId,
@@ -38,7 +34,7 @@ use tracing::debug;
3834
#[cfg(feature = "encryption")]
3935
use tracing::instrument;
4036

41-
use crate::{error::HttpResult, room::Common, BaseRoom, Client, HttpError, Result, RoomType};
37+
use crate::{error::HttpResult, room::Common, BaseRoom, Client, Result, RoomType};
4238

4339
const TYPING_NOTICE_TIMEOUT: Duration = Duration::from_secs(4);
4440
const TYPING_NOTICE_RESEND_TIMEOUT: Duration = Duration::from_secs(3);
@@ -811,50 +807,4 @@ impl Joined {
811807

812808
self.client.send(request, None).await
813809
}
814-
815-
/// Adds a tag to the room, or updates it if it already exists.
816-
///
817-
/// Returns the [`create_tag::Response`] from the server.
818-
///
819-
/// # Arguments
820-
/// * `tag` - The tag to add or update.
821-
///
822-
/// * `tag_info` - Information about the tag, generally containing the
823-
/// `order` parameter.
824-
///
825-
/// # Example
826-
///
827-
/// ```no_run
828-
/// # use ruma::events::tag::TagInfo;
829-
/// # futures::executor::block_on(async {
830-
/// # let homeserver = url::Url::parse("http://localhost:8080")?;
831-
/// # let mut client = matrix_sdk::Client::new(homeserver)?;
832-
/// # let room_id = matrix_sdk::ruma::room_id!("!test:localhost");
833-
/// use matrix_sdk::ruma::events::tag::TagInfo;
834-
///
835-
/// if let Some(room) = client.get_joined_room(&room_id) {
836-
/// let mut tag_info = TagInfo::new();
837-
/// tag_info.order = Some(0.9);
838-
///
839-
/// room.set_tag("u.work", tag_info ).await?;
840-
/// }
841-
/// # Result::<_, matrix_sdk::Error>::Ok(()) });
842-
/// ```
843-
pub async fn set_tag(&self, tag: &str, tag_info: TagInfo) -> HttpResult<create_tag::Response> {
844-
let user_id = self.client.user_id().await.ok_or(HttpError::AuthenticationRequired)?;
845-
let request = create_tag::Request::new(&user_id, self.inner.room_id(), tag, tag_info);
846-
self.client.send(request, None).await
847-
}
848-
849-
/// Removes a tag from the room.
850-
///
851-
/// Returns the [`delete_tag::Response`] from the server.
852-
///
853-
/// # Arguments
854-
/// * `tag` - The tag to remove.
855-
pub async fn remove_tag(&self, tag: &str) -> HttpResult<delete_tag::Response> {
856-
let user_id = self.client.user_id().await.ok_or(HttpError::AuthenticationRequired)?;
857-
let request = delete_tag::Request::new(&user_id, self.inner.room_id(), tag);
858-
self.client.send(request, None).await
859-
}
860810
}

0 commit comments

Comments
 (0)