diff --git a/crates/bitwarden-core/src/platform/state_client.rs b/crates/bitwarden-core/src/platform/state_client.rs index 566b9dea7..404f0f719 100644 --- a/crates/bitwarden-core/src/platform/state_client.rs +++ b/crates/bitwarden-core/src/platform/state_client.rs @@ -1,6 +1,9 @@ use std::sync::Arc; -use bitwarden_state::repository::{Repository, RepositoryItem}; +use bitwarden_state::{ + registry::RepositoryNotFoundError, + repository::{Repository, RepositoryItem}, +}; use crate::Client; @@ -22,7 +25,9 @@ impl StateClient { } /// Get a client managed state repository for a specific type, if it exists. - pub fn get_client_managed(&self) -> Option>> { + pub fn get_client_managed( + &self, + ) -> Result>, RepositoryNotFoundError> { self.client.internal.repository_map.get_client_managed() } } diff --git a/crates/bitwarden-state/src/registry.rs b/crates/bitwarden-state/src/registry.rs index 47e9fb832..b4844b2bb 100644 --- a/crates/bitwarden-state/src/registry.rs +++ b/crates/bitwarden-state/src/registry.rs @@ -4,6 +4,8 @@ use std::{ sync::{Arc, RwLock}, }; +use thiserror::Error; + use crate::repository::{Repository, RepositoryItem}; /// A registry that contains repositories for different types of items. @@ -18,6 +20,11 @@ impl std::fmt::Debug for StateRegistry { } } +/// Repository not found. +#[derive(Debug, Error)] +#[error("Repository not found for the requested type")] +pub struct RepositoryNotFoundError; + impl StateRegistry { /// Creates a new empty `StateRegistry`. #[allow(clippy::new_without_default)] @@ -36,13 +43,16 @@ impl StateRegistry { } /// Retrieves a client-managed repository from the map given its type. - pub fn get_client_managed(&self) -> Option>> { + pub fn get_client_managed( + &self, + ) -> Result>, RepositoryNotFoundError> { self.client_managed .read() .expect("RwLock should not be poisoned") .get(&TypeId::of::()) .and_then(|boxed| boxed.downcast_ref::>>()) .map(Arc::clone) + .ok_or(RepositoryNotFoundError) } } @@ -107,19 +117,19 @@ mod tests { .unwrap() } - assert!(map.get_client_managed::>().is_none()); - assert!(map.get_client_managed::>().is_none()); - assert!(map.get_client_managed::>>().is_none()); + assert!(map.get_client_managed::>().is_err()); + assert!(map.get_client_managed::>().is_err()); + assert!(map.get_client_managed::>>().is_err()); map.register_client_managed(a.clone()); assert_eq!(get(&map).await, Some(TestItem(a.0))); - assert!(map.get_client_managed::>().is_none()); - assert!(map.get_client_managed::>>().is_none()); + assert!(map.get_client_managed::>().is_err()); + assert!(map.get_client_managed::>>().is_err()); map.register_client_managed(b.clone()); assert_eq!(get(&map).await, Some(TestItem(a.0))); assert_eq!(get(&map).await, Some(TestItem(b.0.clone()))); - assert!(map.get_client_managed::>>().is_none()); + assert!(map.get_client_managed::>>().is_err()); map.register_client_managed(c.clone()); assert_eq!(get(&map).await, Some(TestItem(a.0))); diff --git a/crates/bitwarden-state/src/repository.rs b/crates/bitwarden-state/src/repository.rs index bf19092b2..4d186455d 100644 --- a/crates/bitwarden-state/src/repository.rs +++ b/crates/bitwarden-state/src/repository.rs @@ -1,11 +1,17 @@ use std::any::TypeId; +use crate::registry::RepositoryNotFoundError; + /// An error resulting from operations on a repository. #[derive(thiserror::Error, Debug)] pub enum RepositoryError { /// An internal unspecified error. #[error("Internal error: {0}")] Internal(String), + + /// Repository not found. + #[error(transparent)] + RepositoryNotFound(#[from] RepositoryNotFoundError), } /// This trait represents a generic repository interface, capable of storing and retrieving