@@ -4,6 +4,8 @@ use std::{
4
4
sync:: { Arc , RwLock } ,
5
5
} ;
6
6
7
+ use thiserror:: Error ;
8
+
7
9
use crate :: repository:: { Repository , RepositoryItem } ;
8
10
9
11
/// A registry that contains repositories for different types of items.
@@ -18,6 +20,11 @@ impl std::fmt::Debug for StateRegistry {
18
20
}
19
21
}
20
22
23
+ /// Repository not found.
24
+ #[ derive( Debug , Error ) ]
25
+ #[ error( "Repository not found for the requested type" ) ]
26
+ pub struct RepositoryNotFoundError ;
27
+
21
28
impl StateRegistry {
22
29
/// Creates a new empty `StateRegistry`.
23
30
#[ allow( clippy:: new_without_default) ]
@@ -36,13 +43,16 @@ impl StateRegistry {
36
43
}
37
44
38
45
/// Retrieves a client-managed repository from the map given its type.
39
- pub fn get_client_managed < T : RepositoryItem > ( & self ) -> Option < Arc < dyn Repository < T > > > {
46
+ pub fn get_client_managed < T : RepositoryItem > (
47
+ & self ,
48
+ ) -> Result < Arc < dyn Repository < T > > , RepositoryNotFoundError > {
40
49
self . client_managed
41
50
. read ( )
42
51
. expect ( "RwLock should not be poisoned" )
43
52
. get ( & TypeId :: of :: < T > ( ) )
44
53
. and_then ( |boxed| boxed. downcast_ref :: < Arc < dyn Repository < T > > > ( ) )
45
54
. map ( Arc :: clone)
55
+ . ok_or ( RepositoryNotFoundError )
46
56
}
47
57
}
48
58
@@ -107,19 +117,19 @@ mod tests {
107
117
. unwrap ( )
108
118
}
109
119
110
- assert ! ( map. get_client_managed:: <TestItem <usize >>( ) . is_none ( ) ) ;
111
- assert ! ( map. get_client_managed:: <TestItem <String >>( ) . is_none ( ) ) ;
112
- assert ! ( map. get_client_managed:: <TestItem <Vec <u8 >>>( ) . is_none ( ) ) ;
120
+ assert ! ( map. get_client_managed:: <TestItem <usize >>( ) . is_err ( ) ) ;
121
+ assert ! ( map. get_client_managed:: <TestItem <String >>( ) . is_err ( ) ) ;
122
+ assert ! ( map. get_client_managed:: <TestItem <Vec <u8 >>>( ) . is_err ( ) ) ;
113
123
114
124
map. register_client_managed ( a. clone ( ) ) ;
115
125
assert_eq ! ( get( & map) . await , Some ( TestItem ( a. 0 ) ) ) ;
116
- assert ! ( map. get_client_managed:: <TestItem <String >>( ) . is_none ( ) ) ;
117
- assert ! ( map. get_client_managed:: <TestItem <Vec <u8 >>>( ) . is_none ( ) ) ;
126
+ assert ! ( map. get_client_managed:: <TestItem <String >>( ) . is_err ( ) ) ;
127
+ assert ! ( map. get_client_managed:: <TestItem <Vec <u8 >>>( ) . is_err ( ) ) ;
118
128
119
129
map. register_client_managed ( b. clone ( ) ) ;
120
130
assert_eq ! ( get( & map) . await , Some ( TestItem ( a. 0 ) ) ) ;
121
131
assert_eq ! ( get( & map) . await , Some ( TestItem ( b. 0 . clone( ) ) ) ) ;
122
- assert ! ( map. get_client_managed:: <TestItem <Vec <u8 >>>( ) . is_none ( ) ) ;
132
+ assert ! ( map. get_client_managed:: <TestItem <Vec <u8 >>>( ) . is_err ( ) ) ;
123
133
124
134
map. register_client_managed ( c. clone ( ) ) ;
125
135
assert_eq ! ( get( & map) . await , Some ( TestItem ( a. 0 ) ) ) ;
0 commit comments