From 8ead3c106b932fad81cc6e9993774a226f739179 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Fri, 8 May 2026 15:49:13 +0800 Subject: Dispatch arguments using prefix tree with dispatch_tree feature --- mingling_core/src/asset/comp.rs | 35 ++++++++++++++++++++++++++++++----- mingling_core/src/program.rs | 15 ++++++++++++++- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/mingling_core/src/asset/comp.rs b/mingling_core/src/asset/comp.rs index cf1f48c..4fb17c7 100644 --- a/mingling_core/src/asset/comp.rs +++ b/mingling_core/src/asset/comp.rs @@ -12,7 +12,10 @@ pub use shell_ctx::*; #[doc(hidden)] pub use suggest::*; -use crate::{ProgramCollect, debug, exec::match_user_input, only_debug, this, trace}; +use crate::{ProgramCollect, debug, only_debug, this, trace}; + +#[cfg(not(feature = "dispatch_tree"))] +use crate::exec::match_user_input; /// Trait for implementing completion logic. /// @@ -42,20 +45,24 @@ pub struct CompletionHelper; impl CompletionHelper { pub fn exec_completion
(ctx: &ShellContext) -> Suggest
where
- P: ProgramCollect ();
let args = ctx.all_words.iter().skip(1).cloned().collect:: ();
+
+ #[cfg(not(feature = "dispatch_tree"))]
let suggest = if let Ok((dispatcher, args)) = match_user_input(program, &args) {
trace!(
- "dispatcher matched, dispatcher=\"{}\", args={:?}",
+ "dispatcher matched, dispatcher=\"{}\"",
dispatcher.node().to_string(),
- args
);
let begin = dispatcher.begin(args);
if let crate::ChainProcess::Ok((any, _)) = begin {
@@ -71,6 +78,24 @@ impl CompletionHelper {
trace!("no dispatcher matched");
None
};
+ #[cfg(feature = "dispatch_tree")]
+ let suggest = if let Ok(any) = P::dispatch_args_trie(&args) {
+ trace!("entry type: {}", any.member_id);
+
+ let dispatcher_not_found =