Skip to main content

tuwunel_core/config/
room_version.rs

1//! Defines supported Matrix room-version policy.
2//!
3//! Stable, unstable, and experimental version lists are kept here. [`Config`]
4//! helpers apply the opt-in flags and report each enabled version's stability.
5
6use ruma::{RoomVersionId, api::client::discovery::get_capabilities::v3::RoomVersionStability};
7
8use crate::Config;
9
10/// Partially supported non-compliant room versions
11pub const UNSTABLE_ROOM_VERSIONS: &[RoomVersionId] =
12	&[RoomVersionId::V3, RoomVersionId::V4, RoomVersionId::V5];
13
14/// Supported and stable room versions
15pub const STABLE_ROOM_VERSIONS: &[RoomVersionId] = &[
16	RoomVersionId::V6,
17	RoomVersionId::V7,
18	RoomVersionId::V8,
19	RoomVersionId::V9,
20	RoomVersionId::V10,
21	RoomVersionId::V11,
22	RoomVersionId::V12,
23];
24
25/// Experimental and prototype room versions under development.
26pub const EXPERIMENTAL_ROOM_VERSIONS: &[RoomVersionId] = &[];
27
28impl Config {
29	#[inline]
30	#[must_use]
31	/// Reports whether a room version is enabled by this configuration.
32	///
33	/// Stable versions are always enabled. Unstable and experimental versions
34	/// are included only when their respective configuration flags permit
35	/// them.
36	pub fn supported_room_version(&self, version: &RoomVersionId) -> bool {
37		self.supported_room_versions()
38			.any(|(supported_version, _)| &supported_version == version)
39	}
40
41	#[inline]
42	/// Iterates over the room versions enabled by this configuration.
43	///
44	/// Stable versions appear first, followed by permitted unstable and
45	/// experimental versions. Experimental entries are advertised as unstable.
46	pub fn supported_room_versions(
47		&self,
48	) -> impl Iterator<Item = (RoomVersionId, RoomVersionStability)> + '_ {
49		let stable_room_versions = STABLE_ROOM_VERSIONS
50			.iter()
51			.cloned()
52			.map(|version| (version, RoomVersionStability::Stable));
53
54		let unstable_room_versions = UNSTABLE_ROOM_VERSIONS
55			.iter()
56			.filter(|_| self.allow_unstable_room_versions)
57			.cloned()
58			.map(|version| (version, RoomVersionStability::Unstable));
59
60		let experimental_room_versions = EXPERIMENTAL_ROOM_VERSIONS
61			.iter()
62			.filter(|_| self.allow_experimental_room_versions)
63			.cloned()
64			.map(|version| (version, RoomVersionStability::Unstable));
65
66		stable_room_versions
67			.chain(unstable_room_versions)
68			.chain(experimental_room_versions)
69	}
70}