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 ProgramSetup for BasicProgramSetup where C: ProgramCollect, { fn setup(self, program: &mut Program) { 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) -> Self { Self { flag } } } impl<'a, C> ProgramSetup for HelpFlagSetup<'a> where C: ProgramCollect, { fn setup(self, program: &mut Program) { let args = program.take_args(); let remains_arg = PickerArg::>::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) -> Self { Self { flag } } } impl<'a, C> ProgramSetup for QuietFlagSetup<'a> where C: ProgramCollect, { fn setup(self, program: &mut Program) { let args = program.take_args(); let remains_arg = PickerArg::>::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) -> Self { Self { flag } } } impl<'a, C> ProgramSetup for ConfirmFlagSetup<'a> where C: ProgramCollect, { fn setup(self, program: &mut Program) { let args = program.take_args(); let remains_arg = PickerArg::>::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, } } }