Skip to main content

reovim_driver_git/
lib.rs

1#![cfg_attr(coverage_nightly, allow(unused_features))]
2#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
3//! Git provider driver for reovim.
4//!
5//! This driver defines the interface for git data access.
6//! Following the mechanism/policy separation:
7//!
8//! - **Mechanism** (this driver): [`GitProvider`] trait, typed data structs,
9//!   [`GitProviderStore`] for service discovery
10//! - **Policy** (modules): Implementations such as subprocess-based git
11//!   access or library-based (libgit2)
12//!
13//! # Architecture (#530)
14//!
15//! Cross-cutting git data (branches, status, log, diff hunks) is provided
16//! once at the driver layer and consumed by multiple modules (pickers,
17//! statusline, gutter signs, blame) through `ServiceRegistry`.
18//!
19//! ```text
20//! ┌─────────────────────────────────────────────────────────┐
21//! │  Consumers (pickers, statusline, gutter, blame)         │
22//! │  → services.get::<GitProviderStore>()?.get()?           │
23//! ├─────────────────────────────────────────────────────────┤
24//! │  ServiceRegistry                                        │
25//! │  → GitProviderStore holds Arc<dyn GitProvider>          │
26//! ├─────────────────────────────────────────────────────────┤
27//! │  Driver (this crate)                                    │
28//! │  → GitProvider trait, typed data structs                │
29//! ├─────────────────────────────────────────────────────────┤
30//! │  Module (reovim-module-git)                             │
31//! │  → SubprocessGitProvider implementation                 │
32//! └─────────────────────────────────────────────────────────┘
33//! ```
34//!
35//! # Example
36//!
37//! ```ignore
38//! use reovim_driver_git::{GitProviderStore, GitProvider};
39//!
40//! // In module init():
41//! let store = ctx.services.get_or_create::<GitProviderStore>();
42//! store.register(Arc::new(SubprocessGitProvider));
43//!
44//! // In any consumer:
45//! let store = ctx.services.get::<GitProviderStore>()?;
46//! let git = store.get()?;
47//! let branches = git.branches(&cwd);
48//! ```
49
50mod provider;
51mod store;
52pub mod types;
53
54pub use {provider::GitProvider, store::GitProviderStore};
55
56#[cfg(test)]
57#[path = "provider_tests.rs"]
58mod provider_tests;
59
60#[cfg(test)]
61#[path = "store_tests.rs"]
62mod store_tests;
63
64#[cfg(test)]
65#[path = "types_tests.rs"]
66mod types_tests;