tuwunel_matrix/room_version.rs
1//! Room-version identifiers and rule lookup.
2//!
3//! The module re-exports Ruma's room-version types and resolves the rules for
4//! supported versions. It also extracts versions from room creation events.
5
6use ruma::{RoomVersionId, events::room::create::RoomCreateEventContent};
7pub use ruma::{RoomVersionId as RoomVersion, room_version_rules::RoomVersionRules};
8use tuwunel_core::{Result, err};
9
10use crate::Event;
11
12/// Resolves the rule set for a supported room version.
13///
14/// Known versions return Ruma's complete authorization, redaction, and
15/// event-format rules. Custom or unsupported identifiers produce an
16/// unsupported-version result.
17pub fn rules(room_version_id: &RoomVersionId) -> Result<RoomVersionRules> {
18 room_version_id.rules().ok_or_else(|| {
19 err!(Request(UnsupportedRoomVersion(
20 "Unknown or unsupported room version {room_version_id:?}.",
21 )))
22 })
23}
24
25/// Extracts the room version declared by a room creation event.
26///
27/// The event content is deserialized as `m.room.create` content. The returned
28/// identifier is owned independently of the event.
29pub fn from_create_event<Pdu: Event>(create_event: &Pdu) -> Result<RoomVersionId> {
30 let content: RoomCreateEventContent = create_event.get_content()?;
31 Ok(from_create_content(&content).clone())
32}
33
34/// Borrows the room version from parsed room creation content.
35///
36/// Ruma applies the protocol default while deserializing content that omits the
37/// field. This accessor performs no additional validation.
38#[inline]
39#[must_use]
40pub fn from_create_content(content: &RoomCreateEventContent) -> &RoomVersionId {
41 &content.room_version
42}