11use crate :: matcher:: { default, postgresql_binaries} ;
2+ use crate :: Error :: PoisonedLock ;
23use crate :: { Result , DEFAULT_POSTGRESQL_URL } ;
34use lazy_static:: lazy_static;
45use semver:: Version ;
@@ -34,16 +35,35 @@ impl MatchersRegistry {
3435
3536 /// Get a matcher for the specified URL, or the default matcher if no matcher is
3637 /// registered for the URL.
37- fn get < S : AsRef < str > > ( & self , url : S ) -> MatcherFn {
38+ ///
39+ /// # Errors
40+ /// * If the registry is poisoned.
41+ fn get < S : AsRef < str > > ( & self , url : S ) -> Result < MatcherFn > {
3842 let url = Some ( url. as_ref ( ) . to_string ( ) ) ;
3943 if let Some ( matcher) = self . matchers . get ( & url) {
40- return * matcher. read ( ) . unwrap ( ) ;
44+ let matcher = * matcher
45+ . read ( )
46+ . map_err ( |error| PoisonedLock ( error. to_string ( ) ) ) ?;
47+ return Ok ( matcher) ;
4148 }
4249
43- match self . matchers . get ( & None ) {
44- Some ( matcher) => * matcher. read ( ) . unwrap ( ) ,
50+ let matcher = match self . matchers . get ( & None ) {
51+ Some ( matcher) => * matcher
52+ . read ( )
53+ . map_err ( |error| PoisonedLock ( error. to_string ( ) ) ) ?,
4554 None => default:: matcher,
46- }
55+ } ;
56+ Ok ( matcher)
57+ }
58+
59+ /// Get the number of matchers in the registry.
60+ fn len ( & self ) -> usize {
61+ self . matchers . len ( )
62+ }
63+
64+ /// Check if the registry is empty.
65+ fn is_empty ( & self ) -> bool {
66+ self . matchers . is_empty ( )
4767 }
4868}
4969
@@ -60,39 +80,71 @@ impl Default for MatchersRegistry {
6080/// Registers a matcher for a URL. Newly registered matchers with the same url will override
6181/// existing ones.
6282///
63- /// # Panics
83+ /// # Errors
6484/// * If the registry is poisoned.
6585#[ allow( dead_code) ]
66- pub fn register < S : AsRef < str > > ( url : Option < S > , matcher_fn : MatcherFn ) {
67- let mut registry = REGISTRY . lock ( ) . unwrap ( ) ;
86+ pub fn register < S : AsRef < str > > ( url : Option < S > , matcher_fn : MatcherFn ) -> Result < ( ) > {
87+ let mut registry = REGISTRY
88+ . lock ( )
89+ . map_err ( |error| PoisonedLock ( error. to_string ( ) ) ) ?;
6890 registry. register ( url, matcher_fn) ;
91+ Ok ( ( ) )
6992}
7093
7194/// Get a matcher for the specified URL, or the default matcher if no matcher is
7295/// registered for the URL.
7396///
74- /// # Panics
97+ /// # Errors
7598/// * If the registry is poisoned.
76- pub fn get < S : AsRef < str > > ( url : S ) -> MatcherFn {
77- let registry = REGISTRY . lock ( ) . unwrap ( ) ;
99+ pub fn get < S : AsRef < str > > ( url : S ) -> Result < MatcherFn > {
100+ let registry = REGISTRY
101+ . lock ( )
102+ . map_err ( |error| PoisonedLock ( error. to_string ( ) ) ) ?;
78103 registry. get ( url)
79104}
80105
106+ /// Get the number of matchers in the registry.
107+ ///
108+ /// # Errors
109+ /// * If the registry is poisoned.
110+ pub fn len ( ) -> Result < usize > {
111+ let registry = REGISTRY
112+ . lock ( )
113+ . map_err ( |error| PoisonedLock ( error. to_string ( ) ) ) ?;
114+ Ok ( registry. len ( ) )
115+ }
116+
117+ /// Check if the registry is empty.
118+ ///
119+ /// # Errors
120+ /// * If the registry is poisoned.
121+ pub fn is_empty ( ) -> Result < bool > {
122+ let registry = REGISTRY
123+ . lock ( )
124+ . map_err ( |error| PoisonedLock ( error. to_string ( ) ) ) ?;
125+ Ok ( registry. is_empty ( ) )
126+ }
127+
81128#[ cfg( test) ]
82129mod tests {
83130 use super :: * ;
131+ use crate :: Error :: PoisonedLock ;
84132 use std:: env;
85133
86134 #[ test]
87135 fn test_register ( ) -> Result < ( ) > {
88- let matchers = REGISTRY . lock ( ) . unwrap ( ) . matchers . len ( ) ;
89- assert ! ( !REGISTRY . lock( ) . unwrap( ) . matchers. is_empty( ) ) ;
90- REGISTRY . lock ( ) . unwrap ( ) . matchers . remove ( & None :: < String > ) ;
91- assert_ne ! ( matchers, REGISTRY . lock( ) . unwrap( ) . matchers. len( ) ) ;
92- register ( None :: < & str > , default:: matcher) ;
93- assert_eq ! ( matchers, REGISTRY . lock( ) . unwrap( ) . matchers. len( ) ) ;
94-
95- let matcher = get ( DEFAULT_POSTGRESQL_URL ) ;
136+ let matchers = len ( ) ?;
137+ assert ! ( !is_empty( ) ?) ;
138+ REGISTRY
139+ . lock ( )
140+ . map_err ( |error| PoisonedLock ( error. to_string ( ) ) ) ?
141+ . matchers
142+ . remove ( & None :: < String > ) ;
143+ assert_ne ! ( matchers, len( ) ?) ;
144+ register ( None :: < & str > , default:: matcher) ?;
145+ assert_eq ! ( matchers, len( ) ?) ;
146+
147+ let matcher = get ( DEFAULT_POSTGRESQL_URL ) ?;
96148 let version = Version :: new ( 16 , 3 , 0 ) ;
97149 let target = target_triple:: TARGET ;
98150 let name = format ! ( "postgresql-{version}-{target}.tar.gz" ) ;
@@ -103,7 +155,7 @@ mod tests {
103155
104156 #[ test]
105157 fn test_default_matcher ( ) -> Result < ( ) > {
106- let matcher = get ( "https://foo.com" ) ;
158+ let matcher = get ( "https://foo.com" ) ? ;
107159 let version = Version :: new ( 16 , 3 , 0 ) ;
108160 let os = env:: consts:: OS ;
109161 let arch = env:: consts:: ARCH ;
0 commit comments