From 1d1baf75a3acb5eb32913a8bdad42bae42844aa2 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Wed, 24 Jun 2026 12:01:38 +0800 Subject: Redesign hook system with structured info types and ProgramControls --- mingling/src/example_docs.rs | 32 +++++++++++++++++++------------- mingling/src/setups/exit_code.rs | 11 ++++++++--- mingling/src/setups/repl_basic.rs | 11 ++++++----- 3 files changed, 33 insertions(+), 21 deletions(-) (limited to 'mingling/src') diff --git a/mingling/src/example_docs.rs b/mingling/src/example_docs.rs index 3171c22..ea8e539 100644 --- a/mingling/src/example_docs.rs +++ b/mingling/src/example_docs.rs @@ -175,7 +175,7 @@ pub mod example_argument_parse {} /// program.with_dispatcher(CMDDownload); /// /// // Add a hook to display when the download begins -/// program.with_hook(ProgramHook::empty().on_begin(|| println!("Download begin"))); +/// program.with_hook(ProgramHook::empty().on_begin::<_, ()>(|_| println!("Download begin"))); /// /// // --------- IMPORTANT --------- /// // The return values of `exec_*()` related functions have been replaced with Futures @@ -1359,7 +1359,10 @@ pub mod example_help {} /// /// Source code (./src/main.rs) /// ```ignore -/// use mingling::{hook::ProgramHook, prelude::*}; +/// use mingling::{ +/// hook::{ProgramControlUnit, ProgramHook}, +/// prelude::*, +/// }; /// /// dispatcher!("greet", CMDGreet => EntryGreet); /// @@ -1369,18 +1372,18 @@ pub mod example_help {} /// // --------- IMPORTANT --------- /// program.with_hook( /// ProgramHook::::empty() -/// .on_begin(|| println!("[DEBUG] Program is begin")) -/// .on_pre_dispatch(|args| println!("[DEBUG] Pre dispatch: {args:?}")) -/// .on_post_dispatch(|c: &_| println!("[DEBUG] Post dispatch: {c:?}")) -/// .on_pre_chain(|c: &_, _| { -/// println!("[DEBUG] Pre chain: {c}"); +/// .on_begin::<_, ()>(|_| println!("[DEBUG] Program is begin")) +/// .on_pre_dispatch(|info| println!("[DEBUG] Pre dispatch: {}", info.arguments.join(" "))) +/// .on_post_dispatch(|info| println!("[DEBUG] Post dispatch: {}", info.entry)) +/// .on_pre_chain(|info| { +/// println!("[DEBUG] Pre chain: {}", info.input); /// }) -/// .on_post_chain(|any_output| println!("[DEBUG] Post chain: {}", any_output.member_id)) -/// .on_finish(|| { +/// .on_post_chain(|info| println!("[DEBUG] Post chain: {}", info.output.member_id)) +/// .on_finish(|_| { /// println!("[DEBUG] Loop end"); -/// 0 // Override exit code +/// ProgramControlUnit::OverrideExitCode(0) // Override exit code /// }) -/// .on_pre_render(|c: &_, _| println!("[DEBUG] Pre render: {c}")) +/// .on_pre_render(|info| println!("[DEBUG] Pre render: {}", info.input)) /// .on_post_render(|_| println!("[DEBUG] Post render")), /// ); /// // --------- IMPORTANT --------- @@ -1854,7 +1857,10 @@ pub mod example_pack_err {} /// program.stdout_setting.silence_panic = true; /// /// // Define a hook to output &ProgramPanic when a Panic occurs -/// program.with_hook(ProgramHook::empty().on_exec_panic(|info| println!("Program panic: {info}"))); +/// program.with_hook( +/// ProgramHook::empty() +/// .on_exec_panic::<_, ()>(|info| println!("Program panic: {}", info.panic)), +/// ); /// // --------- IMPORTANT --------- /// /// let _ = program.exec(); @@ -1967,7 +1973,7 @@ pub mod example_panic_unwind {} /// })); /// /// // Add hooks to handle REPL-related events -/// program.with_hook(ProgramHook::empty().on_repl_begin(|| { +/// program.with_hook(ProgramHook::empty().on_repl_begin(|_| { /// // Print welcome message /// println!("Welcome!"); /// })); diff --git a/mingling/src/setups/exit_code.rs b/mingling/src/setups/exit_code.rs index ed8204c..025ed8a 100644 --- a/mingling/src/setups/exit_code.rs +++ b/mingling/src/setups/exit_code.rs @@ -1,6 +1,11 @@ use std::marker::PhantomData; -use mingling_core::{ProgramCollect, hook::ProgramHook, setup::ProgramSetup, this}; +use mingling_core::{ + ProgramCollect, + hook::{ProgramControlUnit, ProgramHook}, + setup::ProgramSetup, + this, +}; use crate::res::ResExitCode; @@ -32,9 +37,9 @@ where program.with_resource(ResExitCode { exit_code: 0 }); // Insert hook to override exit code before program ends - program.with_hook(ProgramHook::empty().on_finish(|| { + program.with_hook(ProgramHook::empty().on_finish(|_| { let this = this::().res_or_default::(); - this.exit_code + ProgramControlUnit::OverrideExitCode(this.exit_code) })); } } diff --git a/mingling/src/setups/repl_basic.rs b/mingling/src/setups/repl_basic.rs index 8b9b83f..71a38d2 100644 --- a/mingling/src/setups/repl_basic.rs +++ b/mingling/src/setups/repl_basic.rs @@ -9,7 +9,7 @@ where C: ProgramCollect, { fn setup(self, program: &mut Program) { - program.with_hook(ProgramHook::empty().on_repl_readline(|| readline().ok())); + program.with_hook(ProgramHook::empty().on_repl_readline(|_| readline().ok())); } } @@ -48,7 +48,7 @@ where print!("{}", PROMPT.get().unwrap()); let _ = std::io::stdout().flush(); } - program.with_hook(ProgramHook::empty().on_repl_pre_readline(print_prompt)); + program.with_hook(ProgramHook::empty().on_repl_pre_readline(|_| print_prompt())); } BasicREPLPromptSetup::Func(f) => { static FUNC: std::sync::OnceLock String> = std::sync::OnceLock::new(); @@ -57,7 +57,8 @@ where print!("{}", FUNC.get().unwrap()()); let _ = std::io::stdout().flush(); } - program.with_hook(ProgramHook::empty().on_repl_pre_readline(print_func_prompt)); + program + .with_hook(ProgramHook::empty().on_repl_pre_readline(|_| print_func_prompt())); } } } @@ -71,8 +72,8 @@ where { fn setup(self, program: &mut Program) { program.with_hook(ProgramHook::empty().on_repl_receive_result(|r| { - if !r.is_empty() { - println!("{}", r.trim()) + if !r.result.is_empty() { + println!("{}", r.result.trim()) } })); } -- cgit