From ab7c5785fb290541ad4361c0d46241817c3ff5f9 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Mon, 18 May 2026 16:02:57 +0800 Subject: Refactor program module into submodules --- mingling_core/src/program/collection.rs | 76 +++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 mingling_core/src/program/collection.rs (limited to 'mingling_core/src/program/collection.rs') diff --git a/mingling_core/src/program/collection.rs b/mingling_core/src/program/collection.rs new file mode 100644 index 0000000..dec2af6 --- /dev/null +++ b/mingling_core/src/program/collection.rs @@ -0,0 +1,76 @@ +#[cfg(feature = "async")] +use std::pin::Pin; + +#[cfg(feature = "dispatch_tree")] +use crate::Dispatcher; + +use crate::{AnyOutput, ChainProcess, Groupped, RenderResult}; + +#[cfg(feature = "general_renderer")] +use crate::{GeneralRendererSetting, error::GeneralRendererSerializeError}; + +#[cfg(feature = "comp")] +use crate::{ShellContext, Suggest}; + +/// Collected program context +/// +/// Note: It is recommended to use the `gen_program!()` macro from [mingling_macros](https://crates.io/crates/mingling_macros) to automatically create this type +pub trait ProgramCollect { + /// Enum type representing internal IDs for the program + type Enum; + type DispatcherNotFound: Groupped; + type RendererNotFound: Groupped; + type EmptyResult: Groupped; + + /// Use a prefix tree to quickly match arguments and dispatch to an Entry + #[cfg(feature = "dispatch_tree")] + fn dispatch_args_trie( + raw: &Vec, + ) -> Result, crate::error::ProgramInternalExecuteError>; + + /// Get all registered dispatcher names from the program + #[cfg(feature = "dispatch_tree")] + fn get_nodes() -> Vec<(String, &'static (dyn Dispatcher + Send + Sync))>; + + /// Build an [AnyOutput](./struct.AnyOutput.html) to indicate that a renderer was not found + fn build_renderer_not_found(member_id: Self::Enum) -> AnyOutput; + + /// Build an [AnyOutput](./struct.AnyOutput.html) to indicate that a dispatcher was not found + fn build_dispatcher_not_found(args: Vec) -> AnyOutput; + + /// Build an [AnyOutput](./struct.AnyOutput.html) to indicate that the chain returned an empty result + fn build_empty_result() -> AnyOutput; + + /// Render the input [AnyOutput](./struct.AnyOutput.html) + fn render(any: AnyOutput, r: &mut RenderResult); + + /// Render help for Entry + fn render_help(any: AnyOutput, r: &mut RenderResult); + + /// Find a matching chain to continue execution based on the input [AnyOutput](./struct.AnyOutput.html), returning a new [AnyOutput](./struct.AnyOutput.html) + #[cfg(feature = "async")] + fn do_chain( + any: AnyOutput, + ) -> Pin> + Send>>; + + /// Find a matching chain to continue execution based on the input [AnyOutput](./struct.AnyOutput.html), returning a new [AnyOutput](./struct.AnyOutput.html) + #[cfg(not(feature = "async"))] + fn do_chain(any: AnyOutput) -> ChainProcess; + + /// Match and execute specific completion logic based on any Entry + #[cfg(feature = "comp")] + fn do_comp(any: &AnyOutput, ctx: &ShellContext) -> Suggest; + + /// Whether the program has a renderer that can handle the current [AnyOutput](./struct.AnyOutput.html) + fn has_renderer(any: &AnyOutput) -> bool; + + /// Whether the program has a chain that can handle the current [AnyOutput](./struct.AnyOutput.html) + fn has_chain(any: &AnyOutput) -> bool; + + /// Perform general rendering and presentation of any type + #[cfg(feature = "general_renderer")] + fn general_render( + any: AnyOutput, + setting: &GeneralRendererSetting, + ) -> Result; +} -- cgit