use crate::{COMPLETION_SUBCOMMAND, Program, ProgramCollect}; impl Program where C: ProgramCollect, { /// Checks whether the program is currently in a completion mode. /// /// This is determined by checking if the special completion subcommand /// (defined by [`COMPLETION_SUBCOMMAND`]) appears among the parsed arguments. /// When `true`, the program should generate shell completions instead of /// running its normal execution path. pub fn is_completing(&self) -> bool { // Check if the first argument (args[1]) is the completion subcommand self.args .get(1) .is_some_and(|arg| arg == COMPLETION_SUBCOMMAND) } } #[cfg(test)] mod tests { use super::*; use crate::{AnyOutput, ChainProcess, Groupped, RenderResult}; /// Minimal mock collector that satisfies `C: ProgramCollect` /// by setting `Enum = Self`. #[derive(Debug, Clone, PartialEq)] struct MockCollect; impl Groupped for MockCollect { fn member_id() -> MockCollect { MockCollect } } impl ProgramCollect for MockCollect { type Enum = MockCollect; type ErrorDispatcherNotFound = MockCollect; type ErrorRendererNotFound = MockCollect; type ResultEmpty = MockCollect; fn build_renderer_not_found(_member_id: MockCollect) -> AnyOutput { unimplemented!() } fn build_dispatcher_not_found(_args: Vec) -> AnyOutput { unimplemented!() } fn build_empty_result() -> AnyOutput { unimplemented!() } fn render(_any: AnyOutput, _r: &mut RenderResult) { unimplemented!() } fn render_help(_any: AnyOutput, _r: &mut RenderResult) { unimplemented!() } fn do_chain(_any: AnyOutput) -> ChainProcess { unimplemented!() } #[cfg(feature = "comp")] fn do_comp(_any: &AnyOutput, _ctx: &crate::ShellContext) -> crate::Suggest { unimplemented!() } fn has_renderer(_any: &AnyOutput) -> bool { unimplemented!() } fn has_chain(_any: &AnyOutput) -> bool { unimplemented!() } #[cfg(feature = "general_renderer")] fn general_render( _any: AnyOutput, _setting: &crate::GeneralRendererSetting, ) -> Result { unimplemented!() } } #[test] fn test_is_completing_with_comp_subcommand() { let program: Program = Program::new_with_args(["program", "__comp", "some", "args"]); assert!(program.is_completing()); } #[test] fn test_is_completing_with_normal_subcommand() { let program: Program = Program::new_with_args(["program", "normal", "cmd"]); assert!(!program.is_completing()); } #[test] fn test_is_completing_with_no_args() { let program: Program = Program::new_with_args(["program"]); assert!(!program.is_completing()); } }