Skip to main content

tuwunel_core/config/
room_version.rs

1use ruma::{RoomVersionId, api::client::discovery::get_capabilities::v3::RoomVersionStability};
2
3use crate::Config;
4
5/// Partially supported non-compliant room versions
6pub const UNSTABLE_ROOM_VERSIONS: &[RoomVersionId] =
7	&[RoomVersionId::V3, RoomVersionId::V4, RoomVersionId::V5];
8
9/// Supported and stable room versions
10pub const STABLE_ROOM_VERSIONS: &[RoomVersionId] = &[
11	RoomVersionId::V6,
12	RoomVersionId::V7,
13	RoomVersionId::V8,
14	RoomVersionId::V9,
15	RoomVersionId::V10,
16	RoomVersionId::V11,
17	RoomVersionId::V12,
18];
19
20/// Experimental and prototype room versions under development.
21pub const EXPERIMENTAL_ROOM_VERSIONS: &[RoomVersionId] = &[];
22
23impl Config {
24	#[inline]
25	#[must_use]
26	pub fn supported_room_version(&self, version: &RoomVersionId) -> bool {
27		self.supported_room_versions()
28			.any(|(supported_version, _)| &supported_version == version)
29	}
30
31	#[inline]
32	pub fn supported_room_versions(
33		&self,
34	) -> impl Iterator<Item = (RoomVersionId, RoomVersionStability)> + '_ {
35		let stable_room_versions = STABLE_ROOM_VERSIONS
36			.iter()
37			.cloned()
38			.map(|version| (version, RoomVersionStability::Stable));
39
40		let unstable_room_versions = UNSTABLE_ROOM_VERSIONS
41			.iter()
42			.filter(|_| self.allow_unstable_room_versions)
43			.cloned()
44			.map(|version| (version, RoomVersionStability::Unstable));
45
46		let experimental_room_versions = EXPERIMENTAL_ROOM_VERSIONS
47			.iter()
48			.filter(|_| self.allow_experimental_room_versions)
49			.cloned()
50			.map(|version| (version, RoomVersionStability::Unstable));
51
52		stable_room_versions
53			.chain(unstable_room_versions)
54			.chain(experimental_room_versions)
55	}
56}