ruma_client_api/discovery/
get_supported_versions.rs1use std::collections::BTreeMap;
8
9use ruma_common::{
10 api::{request, response, MatrixVersion, Metadata},
11 metadata,
12};
13
14const METADATA: Metadata = metadata! {
15 method: GET,
16 rate_limited: false,
17 authentication: AccessTokenOptional,
18 history: {
19 1.0 => "/_matrix/client/versions",
20 }
21};
22
23#[request(error = crate::Error)]
25#[derive(Default)]
26pub struct Request {}
27
28#[response(error = crate::Error)]
30pub struct Response {
31 pub versions: Vec<String>,
33
34 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
39 pub unstable_features: BTreeMap<String, bool>,
40}
41
42impl Request {
43 pub fn new() -> Self {
45 Self {}
46 }
47}
48
49impl Response {
50 pub fn new(versions: Vec<String>) -> Self {
52 Self { versions, unstable_features: BTreeMap::new() }
53 }
54
55 pub fn known_versions(&self) -> impl DoubleEndedIterator<Item = MatrixVersion> {
63 self.versions
64 .iter()
65 .flat_map(|s| s.parse::<MatrixVersion>())
67 .map(|v| (v.into_parts(), v))
70 .collect::<BTreeMap<_, _>>()
72 .into_values()
74 }
75}
76
77#[cfg(test)]
78mod tests {
79 use ruma_common::api::MatrixVersion;
80
81 use super::Response;
82
83 #[test]
84 fn known_versions() {
85 let none = Response::new(vec![]);
86 assert_eq!(none.known_versions().next(), None);
87
88 let single_known = Response::new(vec!["r0.6.0".to_owned()]);
89 assert_eq!(single_known.known_versions().collect::<Vec<_>>(), vec![MatrixVersion::V1_0]);
90
91 let single_unknown = Response::new(vec!["v0.0".to_owned()]);
92 assert_eq!(single_unknown.known_versions().next(), None);
93 }
94
95 #[test]
96 fn known_versions_order() {
97 let sorted = Response::new(vec![
98 "r0.0.1".to_owned(),
99 "r0.5.0".to_owned(),
100 "r0.6.0".to_owned(),
101 "r0.6.1".to_owned(),
102 "v1.1".to_owned(),
103 "v1.2".to_owned(),
104 ]);
105 assert_eq!(
106 sorted.known_versions().collect::<Vec<_>>(),
107 vec![MatrixVersion::V1_0, MatrixVersion::V1_1, MatrixVersion::V1_2],
108 );
109
110 let sorted_reverse = Response::new(vec![
111 "v1.2".to_owned(),
112 "v1.1".to_owned(),
113 "r0.6.1".to_owned(),
114 "r0.6.0".to_owned(),
115 "r0.5.0".to_owned(),
116 "r0.0.1".to_owned(),
117 ]);
118 assert_eq!(
119 sorted_reverse.known_versions().collect::<Vec<_>>(),
120 vec![MatrixVersion::V1_0, MatrixVersion::V1_1, MatrixVersion::V1_2],
121 );
122
123 let random_order = Response::new(vec![
124 "v1.1".to_owned(),
125 "r0.6.1".to_owned(),
126 "r0.5.0".to_owned(),
127 "r0.6.0".to_owned(),
128 "r0.0.1".to_owned(),
129 "v1.2".to_owned(),
130 ]);
131 assert_eq!(
132 random_order.known_versions().collect::<Vec<_>>(),
133 vec![MatrixVersion::V1_0, MatrixVersion::V1_1, MatrixVersion::V1_2],
134 );
135 }
136}