diff options
Diffstat (limited to 'mingling')
| -rw-r--r-- | mingling/src/lib.rs | 8 | ||||
| -rw-r--r-- | mingling/src/res.rs | 2 | ||||
| -rw-r--r-- | mingling/src/res/exit_code.rs | 4 | ||||
| -rw-r--r-- | mingling/src/setups.rs | 11 | ||||
| -rw-r--r-- | mingling/src/setups/basic.rs | 28 | ||||
| -rw-r--r-- | mingling/src/setups/exit_code.rs | 40 | ||||
| -rw-r--r-- | mingling/src/setups/general_renderer.rs | 54 |
7 files changed, 147 insertions, 0 deletions
diff --git a/mingling/src/lib.rs b/mingling/src/lib.rs index 79d5b19..41a9ec1 100644 --- a/mingling/src/lib.rs +++ b/mingling/src/lib.rs @@ -167,3 +167,11 @@ pub mod feature { /// Whether the `repl` feature is enabled pub use crate::features::MINGLING_REPL; } + +mod setups; + +pub mod setup { + pub use crate::setups::*; +} + +pub mod res; diff --git a/mingling/src/res.rs b/mingling/src/res.rs new file mode 100644 index 0000000..d625f8f --- /dev/null +++ b/mingling/src/res.rs @@ -0,0 +1,2 @@ +mod exit_code; +pub use exit_code::*; diff --git a/mingling/src/res/exit_code.rs b/mingling/src/res/exit_code.rs new file mode 100644 index 0000000..388a6f1 --- /dev/null +++ b/mingling/src/res/exit_code.rs @@ -0,0 +1,4 @@ +#[derive(Debug, Default, Clone, Copy)] +pub struct ExitCode { + pub exit_code: i32, +} diff --git a/mingling/src/setups.rs b/mingling/src/setups.rs new file mode 100644 index 0000000..351112b --- /dev/null +++ b/mingling/src/setups.rs @@ -0,0 +1,11 @@ +mod basic; +pub use basic::*; + +mod exit_code; +pub use exit_code::*; + +#[cfg(feature = "general_renderer")] +mod general_renderer; + +#[cfg(feature = "general_renderer")] +pub use general_renderer::*; diff --git a/mingling/src/setups/basic.rs b/mingling/src/setups/basic.rs new file mode 100644 index 0000000..6164c64 --- /dev/null +++ b/mingling/src/setups/basic.rs @@ -0,0 +1,28 @@ +use mingling_core::{Program, ProgramCollect, setup::ProgramSetup}; + +/// 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(&mut self, program: &mut Program<C>) { + program.global_flag(["--quiet", "-q"], |p| { + p.stdout_setting.render_output = false; + p.stdout_setting.error_output = false; + }); + + program.global_flag(["--help", "-h"], |p| { + p.user_context.help = true; + }); + + program.global_flag(["--confirm", "-C"], |p| { + p.user_context.confirm = true; + }); + } +} diff --git a/mingling/src/setups/exit_code.rs b/mingling/src/setups/exit_code.rs new file mode 100644 index 0000000..3267f85 --- /dev/null +++ b/mingling/src/setups/exit_code.rs @@ -0,0 +1,40 @@ +use std::marker::PhantomData; + +use mingling_core::{ProgramCollect, hook::ProgramHook, setup::ProgramSetup, this}; + +use crate::res::ExitCode; + +/// Provides the ability to control the program's exit code, which is returned when the program ends. +/// +/// - Use `mingling::update_exit_code` to update the exit code. +/// - Use `mingling::current_exit_code` to query the current exit code. +pub struct ExitCodeSetup<C> { + _collect: PhantomData<C>, +} + +impl<C> Default for ExitCodeSetup<C> +where + C: ProgramCollect<Enum = C> + 'static, +{ + fn default() -> Self { + Self { + _collect: Default::default(), + } + } +} + +impl<C> ProgramSetup<C> for ExitCodeSetup<C> +where + C: ProgramCollect<Enum = C> + 'static, +{ + fn setup(&mut self, program: &mut crate::Program<C>) { + // Insert resource + program.with_resource(ExitCode { exit_code: 0 }); + + // Insert hook to override exit code before program ends + program.with_hook(ProgramHook::empty().on_finish(|| { + let this = this::<C>().res_or_default(); + *this + })); + } +} diff --git a/mingling/src/setups/general_renderer.rs b/mingling/src/setups/general_renderer.rs new file mode 100644 index 0000000..a1d1f06 --- /dev/null +++ b/mingling/src/setups/general_renderer.rs @@ -0,0 +1,54 @@ +use mingling_core::{Program, ProgramCollect, setup::ProgramSetup}; + +/// Sets up the general renderer for the program: +/// +/// - Adds a `--renderer` global argument to specify the renderer type +pub struct GeneralRendererSimpleSetup; + +impl<C> ProgramSetup<C> for GeneralRendererSimpleSetup +where + C: ProgramCollect<Enum = C>, +{ + fn setup(&mut self, program: &mut Program<C>) { + program.global_argument("--renderer", |p, renderer| { + p.general_renderer_name = renderer.into(); + }); + } +} + +/// Sets up the general renderer for the program: +/// +/// - Adds global flags to specify the renderer type: +/// * `--json` for JSON output +/// * `--json-pretty` for pretty-printed JSON output +/// * `--yaml` for YAML output +/// * `--toml` for TOML output +/// * `--ron` for RON output +/// * `--ron-pretty` for pretty-printed RON output +pub struct GeneralRendererSetup; + +impl<C> ProgramSetup<C> for GeneralRendererSetup +where + C: ProgramCollect<Enum = C>, +{ + fn setup(&mut self, program: &mut Program<C>) { + program.global_flag("--json", |p| { + p.general_renderer_name = crate::GeneralRendererSetting::Json + }); + program.global_flag("--json-pretty", |p| { + p.general_renderer_name = crate::GeneralRendererSetting::JsonPretty; + }); + program.global_flag("--yaml", |p| { + p.general_renderer_name = crate::GeneralRendererSetting::Yaml; + }); + program.global_flag("--toml", |p| { + p.general_renderer_name = crate::GeneralRendererSetting::Toml; + }); + program.global_flag("--ron", |p| { + p.general_renderer_name = crate::GeneralRendererSetting::Ron; + }); + program.global_flag("--ron-pretty", |p| { + p.general_renderer_name = crate::GeneralRendererSetting::RonPretty; + }); + } +} |
