Skip to content

Commit 4e60721

Browse files
authored
Change get_client_managed to return result (#338)
Changes `get_client_managed` to return a `Result<_, RepositoryNotFound>` based on discussions in #337 (comment)
1 parent 7e5daa8 commit 4e60721

File tree

3 files changed

+30
-9
lines changed

3 files changed

+30
-9
lines changed

crates/bitwarden-core/src/platform/state_client.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
use std::sync::Arc;
22

3-
use bitwarden_state::repository::{Repository, RepositoryItem};
3+
use bitwarden_state::{
4+
registry::RepositoryNotFoundError,
5+
repository::{Repository, RepositoryItem},
6+
};
47

58
use crate::Client;
69

@@ -22,7 +25,9 @@ impl StateClient {
2225
}
2326

2427
/// Get a client managed state repository for a specific type, if it exists.
25-
pub fn get_client_managed<T: RepositoryItem>(&self) -> Option<Arc<dyn Repository<T>>> {
28+
pub fn get_client_managed<T: RepositoryItem>(
29+
&self,
30+
) -> Result<Arc<dyn Repository<T>>, RepositoryNotFoundError> {
2631
self.client.internal.repository_map.get_client_managed()
2732
}
2833
}

crates/bitwarden-state/src/registry.rs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use std::{
44
sync::{Arc, RwLock},
55
};
66

7+
use thiserror::Error;
8+
79
use 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+
2128
impl 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)));

crates/bitwarden-state/src/repository.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
use std::any::TypeId;
22

3+
use crate::registry::RepositoryNotFoundError;
4+
35
/// An error resulting from operations on a repository.
46
#[derive(thiserror::Error, Debug)]
57
pub enum RepositoryError {
68
/// An internal unspecified error.
79
#[error("Internal error: {0}")]
810
Internal(String),
11+
12+
/// Repository not found.
13+
#[error(transparent)]
14+
RepositoryNotFound(#[from] RepositoryNotFoundError),
915
}
1016

1117
/// This trait represents a generic repository interface, capable of storing and retrieving

0 commit comments

Comments
 (0)