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 {}