#[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; }