aboutsummaryrefslogtreecommitdiff
path: root/mingling/src/setups/picker/basic.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-18 06:12:31 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-18 06:12:31 +0800
commit8d79bf3a2eceafc2316f3eb78140995cbaf072f1 (patch)
tree742688e97b4ab0081dd0792fcefd355187c8669b /mingling/src/setups/picker/basic.rs
parent92127d6c2929057eb909427b96d4ff4abd566dd0 (diff)
feat(setups): add picker module with flag-based program setup
Diffstat (limited to 'mingling/src/setups/picker/basic.rs')
-rw-r--r--mingling/src/setups/picker/basic.rs128
1 files changed, 128 insertions, 0 deletions
diff --git a/mingling/src/setups/picker/basic.rs b/mingling/src/setups/picker/basic.rs
new file mode 100644
index 0000000..6a301c7
--- /dev/null
+++ b/mingling/src/setups/picker/basic.rs
@@ -0,0 +1,128 @@
+use arg_picker::{IntoPicker, PickerArg, PickerArgs, value::Flag};
+use mingling_core::{Program, ProgramCollect, setup::ProgramSetup};
+
+use crate::setups::picker::{CONFIRM_FLAG, HELP_FLAG, QUIET_FLAG};
+
+/// Performs basic program initialization:
+///
+/// - Collects `--quiet` flag to control message rendering
+/// - Collects `--help` flag to enable help mode
+/// - Collects `--confirm` flag to skip user confirmation
+pub struct BasicProgramSetup;
+
+impl<C> ProgramSetup<C> for BasicProgramSetup
+where
+ C: ProgramCollect<Enum = C>,
+{
+ fn setup(self, program: &mut Program<C>) {
+ program.with_setup(HelpFlagSetup::default());
+ program.with_setup(QuietFlagSetup::default());
+ program.with_setup(ConfirmFlagSetup::default());
+ }
+}
+
+/// Provides setup for parsing the user help flag
+///
+/// The default value is `--help / -h`
+pub struct HelpFlagSetup<'a> {
+ flag: &'a PickerArg<'a, Flag>,
+}
+
+impl<'a> HelpFlagSetup<'a> {
+ /// Creates a new `HelpFlagSetup` with the given flag aliases.
+ pub fn new(flag: &'a PickerArg<Flag>) -> Self {
+ Self { flag }
+ }
+}
+
+impl<'a, C> ProgramSetup<C> for HelpFlagSetup<'a>
+where
+ C: ProgramCollect<Enum = C>,
+{
+ fn setup(self, program: &mut Program<C>) {
+ let args = program.take_args();
+ let remains_arg = PickerArg::<PickerArgs<'a>>::new(&[], None, true);
+ let (active, remains) = args.pick(self.flag).pick(&remains_arg).unwrap();
+ program.user_context.help = *active;
+ program.replace_args(remains.into());
+ }
+}
+
+impl<'a> Default for HelpFlagSetup<'a> {
+ fn default() -> Self {
+ Self { flag: &HELP_FLAG }
+ }
+}
+
+/// Provides setup for parsing the quiet flag
+///
+/// The default value is `--quiet / -q`
+pub struct QuietFlagSetup<'a> {
+ flag: &'a PickerArg<'a, Flag>,
+}
+
+impl<'a> QuietFlagSetup<'a> {
+ /// Creates a new `QuietFlagSetup` with the given flag aliases.
+ pub fn new(flag: &'a PickerArg<Flag>) -> Self {
+ Self { flag }
+ }
+}
+
+impl<'a, C> ProgramSetup<C> for QuietFlagSetup<'a>
+where
+ C: ProgramCollect<Enum = C>,
+{
+ fn setup(self, program: &mut Program<C>) {
+ let args = program.take_args();
+ let remains_arg = PickerArg::<PickerArgs<'a>>::new(&[], None, true);
+ let (active, remains) = args.pick(self.flag).pick(&remains_arg).unwrap();
+ if *active {
+ program.stdout_setting.render_output = false;
+ program.stdout_setting.error_output = false;
+ }
+ program.replace_args(remains.into());
+ }
+}
+
+impl<'a> Default for QuietFlagSetup<'a> {
+ fn default() -> Self {
+ Self { flag: &QUIET_FLAG }
+ }
+}
+
+/// Provides setup for parsing the confirm flag
+///
+/// The default value is `--confirm / -C`
+pub struct ConfirmFlagSetup<'a> {
+ flag: &'a PickerArg<'a, Flag>,
+}
+
+impl<'a> ConfirmFlagSetup<'a> {
+ /// Creates a new `ConfirmFlagSetup` with the given flag aliases.
+ pub fn new(flag: &'a PickerArg<Flag>) -> Self {
+ Self { flag }
+ }
+}
+
+impl<'a, C> ProgramSetup<C> for ConfirmFlagSetup<'a>
+where
+ C: ProgramCollect<Enum = C>,
+{
+ fn setup(self, program: &mut Program<C>) {
+ let args = program.take_args();
+ let remains_arg = PickerArg::<PickerArgs<'a>>::new(&[], None, true);
+ let (active, remains) = args.pick(self.flag).pick(&remains_arg).unwrap();
+ if *active {
+ program.user_context.confirm = true;
+ }
+ program.replace_args(remains.into());
+ }
+}
+
+impl<'a> Default for ConfirmFlagSetup<'a> {
+ fn default() -> Self {
+ Self {
+ flag: &CONFIRM_FLAG,
+ }
+ }
+}