aboutsummaryrefslogtreecommitdiff
path: root/mingling_core/src/program/collection.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-05-18 16:02:57 +0800
committer魏曹先生 <1992414357@qq.com>2026-05-18 16:02:57 +0800
commitab7c5785fb290541ad4361c0d46241817c3ff5f9 (patch)
tree042012fe0a6cac2e5da90ccff0df38e64ac50485 /mingling_core/src/program/collection.rs
parentf1408931eb19f90dd96092ea26bea8d14f5ec804 (diff)
Refactor program module into submodules
Diffstat (limited to 'mingling_core/src/program/collection.rs')
-rw-r--r--mingling_core/src/program/collection.rs76
1 files changed, 76 insertions, 0 deletions
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<Self::Enum>;
+ type RendererNotFound: Groupped<Self::Enum>;
+ type EmptyResult: Groupped<Self::Enum>;
+
+ /// Use a prefix tree to quickly match arguments and dispatch to an Entry
+ #[cfg(feature = "dispatch_tree")]
+ fn dispatch_args_trie(
+ raw: &Vec<String>,
+ ) -> Result<AnyOutput<Self::Enum>, crate::error::ProgramInternalExecuteError>;
+
+ /// Get all registered dispatcher names from the program
+ #[cfg(feature = "dispatch_tree")]
+ fn get_nodes() -> Vec<(String, &'static (dyn Dispatcher<Self::Enum> + 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<Self::Enum>;
+
+ /// Build an [AnyOutput](./struct.AnyOutput.html) to indicate that a dispatcher was not found
+ fn build_dispatcher_not_found(args: Vec<String>) -> AnyOutput<Self::Enum>;
+
+ /// Build an [AnyOutput](./struct.AnyOutput.html) to indicate that the chain returned an empty result
+ fn build_empty_result() -> AnyOutput<Self::Enum>;
+
+ /// Render the input [AnyOutput](./struct.AnyOutput.html)
+ fn render(any: AnyOutput<Self::Enum>, r: &mut RenderResult);
+
+ /// Render help for Entry
+ fn render_help(any: AnyOutput<Self::Enum>, 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<Self::Enum>,
+ ) -> Pin<Box<dyn Future<Output = ChainProcess<Self::Enum>> + 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<Self::Enum>) -> ChainProcess<Self::Enum>;
+
+ /// Match and execute specific completion logic based on any Entry
+ #[cfg(feature = "comp")]
+ fn do_comp(any: &AnyOutput<Self::Enum>, ctx: &ShellContext) -> Suggest;
+
+ /// Whether the program has a renderer that can handle the current [AnyOutput](./struct.AnyOutput.html)
+ fn has_renderer(any: &AnyOutput<Self::Enum>) -> bool;
+
+ /// Whether the program has a chain that can handle the current [AnyOutput](./struct.AnyOutput.html)
+ fn has_chain(any: &AnyOutput<Self::Enum>) -> bool;
+
+ /// Perform general rendering and presentation of any type
+ #[cfg(feature = "general_renderer")]
+ fn general_render(
+ any: AnyOutput<Self::Enum>,
+ setting: &GeneralRendererSetting,
+ ) -> Result<RenderResult, GeneralRendererSerializeError>;
+}