11use std:: collections:: BTreeMap ;
22
3+ use as_variant:: as_variant;
34use imbl:: Vector ;
45use matrix_sdk_base:: { sliding_sync:: http, sync:: SyncResponse , PreviousEventsProvider } ;
56use ruma:: {
@@ -14,13 +15,13 @@ use ruma::{
1415use tracing:: error;
1516use url:: Url ;
1617
17- use super :: { Error , SlidingSync , SlidingSyncBuilder } ;
18+ use super :: { SlidingSync , SlidingSyncBuilder } ;
1819use crate :: { config:: RequestConfig , Client , Result , SlidingSyncRoom } ;
1920
2021/// A sliding sync version.
2122#[ derive( Clone , Debug ) ]
2223pub enum Version {
23- /// No version. Useful to represent that sliding sync is disable for
24+ /// No version. Useful to represent that sliding sync is disabled for
2425 /// example, and that the version is unknown.
2526 None ,
2627
@@ -41,13 +42,35 @@ impl Version {
4142 }
4243
4344 pub ( crate ) fn overriding_url ( & self ) -> Option < & Url > {
44- match self {
45- Self :: Proxy { url } => Some ( url) ,
46- _ => None ,
47- }
45+ as_variant ! ( self , Self :: Proxy { url } => url)
4846 }
4947}
5048
49+ /// An error when building a version.
50+ #[ derive( thiserror:: Error , Debug ) ]
51+ pub enum VersionBuilderError {
52+ /// The `.well-known` response is not set.
53+ #[ error( "`.well-known` is not set" ) ]
54+ WellKnownNotSet ,
55+
56+ /// `.well-known` does not contain a `sliding_sync_proxy` entry.
57+ #[ error( "`.well-known` does not contain a `sliding_sync_proxy` entry" ) ]
58+ NoSlidingSyncInWellKnown ,
59+
60+ /// The `sliding_sync_proxy` URL in .well-known` is not valid ({0}).
61+ #[ error( "the `sliding_sync_proxy` URL in .well-known` is not valid ({0})" ) ]
62+ UnparsableSlidingSyncUrl ( url:: ParseError ) ,
63+
64+ /// The `/versions` response is not set.
65+ #[ error( "The `/versions` response is not set" ) ]
66+ MissingVersionsResponse ,
67+
68+ /// `/versions` does not contain `org.matrix.simplified_msc3575` in its
69+ /// `unstable_features`, or it's not set to true.
70+ #[ error( "`/versions` does not contain `org.matrix.simplified_msc3575` in its `unstable_features`, or it's not set to true." ) ]
71+ NativeVersionIsUnset ,
72+ }
73+
5174/// A builder for [`Version`].
5275#[ derive( Clone , Debug ) ]
5376pub enum VersionBuilder {
@@ -87,7 +110,7 @@ impl VersionBuilder {
87110 self ,
88111 well_known : Option < & discover_homeserver:: Response > ,
89112 versions : Option < & get_supported_versions:: Response > ,
90- ) -> Result < Version , Error > {
113+ ) -> Result < Version , VersionBuilderError > {
91114 Ok ( match self {
92115 Self :: None => Version :: None ,
93116
@@ -97,42 +120,27 @@ impl VersionBuilder {
97120
98121 Self :: DiscoverProxy => {
99122 let Some ( well_known) = well_known else {
100- return Err ( Error :: VersionCannotBeDiscovered (
101- "`.well-known` is `None`" . to_owned ( ) ,
102- ) ) ;
123+ return Err ( VersionBuilderError :: WellKnownNotSet ) ;
103124 } ;
104125
105126 let Some ( info) = & well_known. sliding_sync_proxy else {
106- return Err ( Error :: VersionCannotBeDiscovered (
107- "`.well-known` does not contain a `sliding_sync_proxy` entry" . to_owned ( ) ,
108- ) ) ;
127+ return Err ( VersionBuilderError :: NoSlidingSyncInWellKnown ) ;
109128 } ;
110129
111- let url = Url :: parse ( & info. url ) . map_err ( |e| {
112- Error :: VersionCannotBeDiscovered ( format ! (
113- "`.well-known` contains an invalid `sliding_sync_proxy` entry ({e})"
114- ) )
115- } ) ?;
130+ let url =
131+ Url :: parse ( & info. url ) . map_err ( VersionBuilderError :: UnparsableSlidingSyncUrl ) ?;
116132
117133 Version :: Proxy { url }
118134 }
119135
120136 Self :: DiscoverNative => {
121137 let Some ( versions) = versions else {
122- return Err ( Error :: VersionCannotBeDiscovered (
123- "`/versions` is `None`" . to_owned ( ) ,
124- ) ) ;
138+ return Err ( VersionBuilderError :: MissingVersionsResponse ) ;
125139 } ;
126140
127141 match versions. unstable_features . get ( "org.matrix.simplified_msc3575" ) {
128142 Some ( value) if * value => Version :: Native ,
129- _ => {
130- return Err ( Error :: VersionCannotBeDiscovered (
131- "`/versions` does not contain `org.matrix.simplified_msc3575` in its \
132- `unstable_features`"
133- . to_owned ( ) ,
134- ) )
135- }
143+ _ => return Err ( VersionBuilderError :: NativeVersionIsUnset ) ,
136144 }
137145 }
138146 } )
@@ -324,9 +332,11 @@ mod tests {
324332 Mock , ResponseTemplate ,
325333 } ;
326334
327- use super :: { discover_homeserver, get_supported_versions, Error , Version , VersionBuilder } ;
335+ use super :: { discover_homeserver, get_supported_versions, Version , VersionBuilder } ;
328336 use crate :: {
329- error:: Result , sliding_sync:: http, test_utils:: logged_in_client_with_server,
337+ error:: Result ,
338+ sliding_sync:: { http, VersionBuilderError } ,
339+ test_utils:: logged_in_client_with_server,
330340 SlidingSyncList , SlidingSyncMode ,
331341 } ;
332342
@@ -373,9 +383,7 @@ mod tests {
373383 fn test_version_builder_discover_proxy_no_well_known ( ) {
374384 assert_matches ! (
375385 VersionBuilder :: DiscoverProxy . build( None , None ) ,
376- Err ( Error :: VersionCannotBeDiscovered ( msg) ) => {
377- assert_eq!( msg, "`.well-known` is `None`" ) ;
378- }
386+ Err ( VersionBuilderError :: WellKnownNotSet )
379387 ) ;
380388 }
381389
@@ -388,9 +396,7 @@ mod tests {
388396
389397 assert_matches ! (
390398 VersionBuilder :: DiscoverProxy . build( Some ( & response) , None ) ,
391- Err ( Error :: VersionCannotBeDiscovered ( msg) ) => {
392- assert_eq!( msg, "`.well-known` does not contain a `sliding_sync_proxy` entry" ) ;
393- }
399+ Err ( VersionBuilderError :: NoSlidingSyncInWellKnown )
394400 ) ;
395401 }
396402
@@ -404,8 +410,8 @@ mod tests {
404410
405411 assert_matches ! (
406412 VersionBuilder :: DiscoverProxy . build( Some ( & response) , None ) ,
407- Err ( Error :: VersionCannotBeDiscovered ( msg ) ) => {
408- assert_eq!( msg , "`.well-known` contains an invalid `sliding_sync_proxy` entry ( relative URL without a base) " ) ;
413+ Err ( VersionBuilderError :: UnparsableSlidingSyncUrl ( err ) ) => {
414+ assert_eq!( err . to_string ( ) , "relative URL without a base" ) ;
409415 }
410416 ) ;
411417 }
@@ -425,9 +431,7 @@ mod tests {
425431 fn test_version_builder_discover_native_no_supported_versions ( ) {
426432 assert_matches ! (
427433 VersionBuilder :: DiscoverNative . build( None , None ) ,
428- Err ( Error :: VersionCannotBeDiscovered ( msg) ) => {
429- assert_eq!( msg, "`/versions` is `None`" . to_owned( ) ) ;
430- }
434+ Err ( VersionBuilderError :: MissingVersionsResponse )
431435 ) ;
432436 }
433437
@@ -438,12 +442,7 @@ mod tests {
438442
439443 assert_matches ! (
440444 VersionBuilder :: DiscoverNative . build( None , Some ( & response) ) ,
441- Err ( Error :: VersionCannotBeDiscovered ( msg) ) => {
442- assert_eq!(
443- msg,
444- "`/versions` does not contain `org.matrix.simplified_msc3575` in its `unstable_features`" . to_owned( )
445- ) ;
446- }
445+ Err ( VersionBuilderError :: NativeVersionIsUnset )
447446 ) ;
448447 }
449448
0 commit comments