@@ -4,6 +4,8 @@ use std::{
44 sync:: { Arc , RwLock } ,
55} ;
66
7+ use thiserror:: Error ;
8+
79use crate :: repository:: { Repository , RepositoryItem } ;
810
911/// A registry that contains repositories for different types of items.
@@ -18,6 +20,11 @@ impl std::fmt::Debug for StateRegistry {
1820 }
1921}
2022
23+ /// Repository not found.
24+ #[ derive( Debug , Error ) ]
25+ #[ error( "Repository not found for the requested type" ) ]
26+ pub struct RepositoryNotFoundError ;
27+
2128impl StateRegistry {
2229 /// Creates a new empty `StateRegistry`.
2330 #[ allow( clippy:: new_without_default) ]
@@ -36,13 +43,16 @@ impl StateRegistry {
3643 }
3744
3845 /// 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 > {
4049 self . client_managed
4150 . read ( )
4251 . expect ( "RwLock should not be poisoned" )
4352 . get ( & TypeId :: of :: < T > ( ) )
4453 . and_then ( |boxed| boxed. downcast_ref :: < Arc < dyn Repository < T > > > ( ) )
4554 . map ( Arc :: clone)
55+ . ok_or ( RepositoryNotFoundError )
4656 }
4757}
4858
@@ -107,19 +117,19 @@ mod tests {
107117 . unwrap ( )
108118 }
109119
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 ( ) ) ;
113123
114124 map. register_client_managed ( a. clone ( ) ) ;
115125 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 ( ) ) ;
118128
119129 map. register_client_managed ( b. clone ( ) ) ;
120130 assert_eq ! ( get( & map) . await , Some ( TestItem ( a. 0 ) ) ) ;
121131 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 ( ) ) ;
123133
124134 map. register_client_managed ( c. clone ( ) ) ;
125135 assert_eq ! ( get( & map) . await , Some ( TestItem ( a. 0 ) ) ) ;
0 commit comments