Skip to main content

reovim_driver_git/
store.rs

1//! Git provider store for service registry.
2//!
3//! Holds the single registered [`GitProvider`] implementation,
4//! discoverable via `ServiceRegistry::get::<GitProviderStore>()`.
5
6use {
7    reovim_kernel::api::v1::Service,
8    std::{
9        fmt,
10        sync::{Arc, RwLock},
11    },
12};
13
14use crate::provider::GitProvider;
15
16/// Stores the registered [`GitProvider`] implementation.
17///
18/// Registered by the git module during `init()`. Consumers retrieve
19/// the store from `ServiceRegistry` and call [`get()`](Self::get)
20/// to access the provider.
21///
22/// # Example
23///
24/// ```ignore
25/// // In module init():
26/// let store = ctx.services.get_or_create::<GitProviderStore>();
27/// store.register(Arc::new(MyGitProvider));
28///
29/// // In consumers:
30/// let store = ctx.services.get::<GitProviderStore>()?;
31/// let git = store.get()?;
32/// let branch = git.current_branch(&cwd);
33/// ```
34pub struct GitProviderStore {
35    inner: RwLock<Option<Arc<dyn GitProvider>>>,
36}
37
38impl fmt::Debug for GitProviderStore {
39    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
40        f.debug_struct("GitProviderStore")
41            .field("registered", &self.inner.read().unwrap().is_some())
42            .finish()
43    }
44}
45
46impl GitProviderStore {
47    /// Create an empty store.
48    #[must_use]
49    pub fn new() -> Self {
50        Self {
51            inner: RwLock::new(None),
52        }
53    }
54
55    /// Register a provider implementation.
56    ///
57    /// Replaces any previously registered provider.
58    ///
59    /// # Panics
60    ///
61    /// Panics if the internal lock is poisoned.
62    pub fn register(&self, provider: Arc<dyn GitProvider>) {
63        *self.inner.write().unwrap() = Some(provider);
64    }
65
66    /// Get the registered provider, if any.
67    ///
68    /// # Panics
69    ///
70    /// Panics if the internal lock is poisoned.
71    #[must_use]
72    pub fn get(&self) -> Option<Arc<dyn GitProvider>> {
73        self.inner.read().unwrap().clone()
74    }
75}
76
77impl Default for GitProviderStore {
78    fn default() -> Self {
79        Self::new()
80    }
81}
82
83impl Service for GitProviderStore {}