aboutsummaryrefslogtreecommitdiff
path: root/mingling/src/setups/confirmer.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-08-15 06:07:25 +0800
committer魏曹先生 <1992414357@qq.com>2026-08-15 06:07:25 +0800
commitd175e9fee6ab1f76042280f22a86e5764863c642 (patch)
tree3d965bbc10c2049faa2d9d97ddb282940d781277 /mingling/src/setups/confirmer.rs
parent57e20f69efea609d8332cc39d223f4aa46be3c78 (diff)
feat(res): add Confirmer resource and stdin args setup
Add Confirmer with cached confirmation state and predicate-based parsing for yes/no and true/false inputs. Add ConfirmerSetup to register the resource and auto-confirm when skip mode is enabled. Add StandardInputArgsSetup to read piped stdin as appended arguments. Reorganize module exports in res and setups.
Diffstat (limited to 'mingling/src/setups/confirmer.rs')
-rw-r--r--mingling/src/setups/confirmer.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/mingling/src/setups/confirmer.rs b/mingling/src/setups/confirmer.rs
new file mode 100644
index 0000000..1824745
--- /dev/null
+++ b/mingling/src/setups/confirmer.rs
@@ -0,0 +1,60 @@
+use mingling_core::{
+ Program, ProgramCollect, config, hook::ProgramHook, setup::ProgramSetup, this,
+};
+
+use crate::res::Confirmer;
+
+/// Confirmer setup for managing confirmation state
+///
+/// This Setup manages the confirmation flag within the program's resource
+/// store. It registers a [`Confirmer`] resource and sets up a hook that
+/// checks the user's confirmation mode during program execution.
+///
+/// # Usage
+///
+/// This Setup can be registered using the
+/// [`Program`](https://docs.rs/mingling/latest/mingling/struct.Program.html)
+/// `with_setup` method, for example:
+///
+/// ```rust
+/// # use mingling::MockProgramCollect as ThisProgram;
+/// use mingling::Program;
+/// use mingling::setup::ConfirmerSetup;
+///
+/// let mut program = Program::<ThisProgram>::new();
+/// program.with_setup(ConfirmerSetup);
+/// ```
+///
+/// # Behavior
+///
+/// - Registers a [`Confirmer`] resource that tracks confirmation state.
+/// - At the beginning of command execution, checks whether the user's
+/// confirmation mode is set to `Skip`.
+/// - If confirmation is skipped, the [`Confirmer`] resource is updated
+/// to record the confirmed state.
+///
+/// # Notes
+///
+/// - This Setup applies uniformly to all subcommands of the entire program.
+/// - The confirmation state is determined by the global `config` setting;
+/// it does not support per-command overrides.
+pub struct ConfirmerSetup;
+
+impl<C> ProgramSetup<C> for ConfirmerSetup
+where
+ C: ProgramCollect<Enum = C> + 'static,
+{
+ fn setup(self, program: &mut Program<C>) {
+ program.with_resource(Confirmer::new());
+
+ program.with_hook(ProgramHook::empty().on_pre_dispatch::<_, ()>(|_| {
+ let p = this::<C>();
+ let confirmed = p.user_context.confirmation == config::ConfirmationMode::Skip;
+ if confirmed {
+ p.modify_res(|c: &mut Confirmer| {
+ c.set_confirmed();
+ });
+ }
+ }));
+ }
+}