From 81528b273c18693ebd3f05c6f8057ff8e632f4a0 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Sun, 7 Jun 2026 02:25:27 +0800 Subject: Refactor mling to use new program architecture and install scripts --- mling/src/bin/mling.rs | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 mling/src/bin/mling.rs (limited to 'mling/src/bin') diff --git a/mling/src/bin/mling.rs b/mling/src/bin/mling.rs new file mode 100644 index 0000000..587aeb9 --- /dev/null +++ b/mling/src/bin/mling.rs @@ -0,0 +1,86 @@ +use std::{env::current_dir, process::exit}; + +use colored::Colorize; +use mingling::{ + Program, + hook::ProgramHook, + macros::program_setup, + setup::{ExitCodeSetup, GeneralRendererSetup, HelpFlagSetup, QuietFlagSetup}, +}; +use mingling_cli::{ThisProgram, display::markdown, res::ResCurrentDir}; + +fn main() { + #[cfg(windows)] + colored::control::set_virtual_terminal(true).unwrap(); + + // Preprocess args to handle cargo-mling invocations + let mut args: Vec = std::env::args().collect(); + if args.first().map_or(false, |a| a.contains("cargo-mling")) { + args[0] = "cargo-mling".to_string(); + } + if args.get(1).map_or(false, |a| a == "mling") { + args.remove(1); + } + + // Build program with preprocessed args + let mut program = Program::::new_with_args(args); + + // Intercept Version + program.global_flag(["-V", "--version"], |_| { + eprintln!(include_str!("../helps/version.txt")); + exit(0) + }); + + // Intercept Help + program.with_hook(ProgramHook::empty().on_post_dispatch(|c| match c { + // When dispatcher is not found + ThisProgram::ErrorDispatcherNotFound => { + // And user requests Help + if ThisProgram::this().user_context.help { + // Print help + eprintln!("{}", markdown(include_str!("../helps/mling_help.txt"))); + exit(0) + } + } + _ => {} + })); + + // Setups + program.with_setup(HelpFlagSetup::new(["-h", "--help"])); + program.with_setup(GeneralRendererSetup); + program.with_setup(StandardOutputSetup); + program.with_setup(ExitCodeSetup::default()); + + // Resources + program.with_resource(ResCurrentDir { + path: current_dir().unwrap(), + }); + + // Execute + let quiet = program.stdout_setting.quiet; + let error_output = program.stdout_setting.error_output && !quiet; + let render_output = program.stdout_setting.render_output && !quiet; + let result = program.exec_without_render().unwrap(); + if !result.is_empty() { + if result.exit_code == 0 && render_output { + println!("{}", result.trim()); + } else if error_output { + eprintln!("{}", result.trim().bright_red()); + } + } + exit(result.exit_code); +} + +#[program_setup] +fn standard_output_setup(program: &mut Program) { + program.with_setup(QuietFlagSetup::new("--silence")); + program.global_flag(["--no-error"], |program| { + program.stdout_setting.error_output = false; + }); + program.global_flag(["--no-result"], |program| { + program.stdout_setting.render_output = false; + }); + program.global_flag(["--silence", "--quiet"], |program| { + program.stdout_setting.quiet = true; + }); +} -- cgit