Skip to main content

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