Skip to main content

reovim_module_cmdline/
lib.rs

1#![cfg_attr(coverage_nightly, allow(unused_features))]
2#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
3//! Command-line mode module - POLICY layer.
4//!
5//! This module owns all command-line mode state and behavior:
6//! - [`CmdlineState`] - per-client session extension
7//! - [`CmdlinePrompt`] - prompt type enum (`:`, `/`, `?`)
8//! - [`CmdlineBridge`] - adapts state to JSON for gRPC
9//!
10//! # Architecture (#468)
11//!
12//! `CmdlineState` was moved here from the driver layer because it is POLICY
13//! (defines HOW command-line mode behaves). The driver layer only provides
14//! the trait contracts (MECHANISM).
15//!
16//! The bridge is registered via `BridgeProvider` during `init()`, enabling
17//! generic bridge detection without hardcoded server/driver code.
18
19mod bridge;
20mod state;
21
22pub use {
23    bridge::CmdlineBridge,
24    state::{CmdlineMessage, CmdlinePrompt, CmdlineState},
25};
26
27use {
28    reovim_driver_session::bridges::BridgeProvider,
29    reovim_kernel::api::v1::{Module, ModuleContext, ModuleError, ModuleId, ProbeResult, Version},
30};
31
32const KIND: &str = "cmdline";
33const MODULE_ID: ModuleId = ModuleId::new("cmdline");
34
35/// Command-line mode module.
36///
37/// Registers `CmdlineBridge` via `BridgeProvider` during `init()`.
38pub struct CmdlineModule;
39
40impl CmdlineModule {
41    /// Create a new instance.
42    #[must_use]
43    pub const fn new() -> Self {
44        Self
45    }
46}
47
48impl Default for CmdlineModule {
49    fn default() -> Self {
50        Self::new()
51    }
52}
53
54impl Module for CmdlineModule {
55    fn id(&self) -> ModuleId {
56        MODULE_ID
57    }
58
59    fn name(&self) -> &'static str {
60        "cmdline"
61    }
62
63    fn version(&self) -> Version {
64        Version::new(0, 1, 0)
65    }
66
67    #[cfg_attr(coverage_nightly, coverage(off))]
68    fn init(&mut self, ctx: &ModuleContext) -> ProbeResult {
69        // Register CmdlineBridge via BridgeProvider (#468)
70        let provider = ctx.services.get_or_create::<BridgeProvider>();
71        provider.register(CmdlineBridge);
72        ProbeResult::Success
73    }
74
75    fn exit(&mut self) -> Result<(), ModuleError> {
76        Ok(())
77    }
78
79    fn extension_kinds(&self) -> &[&'static str] {
80        &[KIND]
81    }
82}
83
84#[cfg(feature = "dynamic")]
85reovim_module_macros::declare_module!(CmdlineModule);
86
87#[cfg(test)]
88#[path = "lib_tests.rs"]
89mod tests;