diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-06-07 15:40:53 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-06-07 15:40:53 +0800 |
| commit | 86647e7b5057826d7bb85381044d5b691fbbafa3 (patch) | |
| tree | 69a1768c3c8f571bfde426948bb58fe2e3e93bf2 /mling | |
| parent | 8aa276beb88086b866be8a446289106be237348a (diff) | |
Move error handling into its own module and add show.binaries command
Diffstat (limited to 'mling')
| -rw-r--r-- | mling/Cargo.toml | 2 | ||||
| -rw-r--r-- | mling/src/cli.rs | 44 | ||||
| -rw-r--r-- | mling/src/lib.rs | 33 | ||||
| -rw-r--r-- | mling/src/proj_mgr/metadata.rs | 2 | ||||
| -rw-r--r-- | mling/src/proj_mgr/mod.rs | 3 | ||||
| -rw-r--r-- | mling/src/proj_mgr/show_binaries.rs | 70 |
6 files changed, 114 insertions, 40 deletions
diff --git a/mling/Cargo.toml b/mling/Cargo.toml index 634b76e..e73fe02 100644 --- a/mling/Cargo.toml +++ b/mling/Cargo.toml @@ -20,11 +20,11 @@ path = "src/bin/mling.rs" [dependencies] mingling = { path = "../mingling", features = [ - "builds", "parser", "comp", "general_renderer", "extra_macros", + "yaml_serde_fmt", ] } serde = { version = "1", features = ["derive"] } diff --git a/mling/src/cli.rs b/mling/src/cli.rs index 0bae4a4..21f7220 100644 --- a/mling/src/cli.rs +++ b/mling/src/cli.rs @@ -1,18 +1,20 @@ -use std::{env::current_dir, path::PathBuf, process::exit, str::FromStr}; - use crate::{ - CMDCompletion, PackageManagerSetup, ProjectManagerSetup, ThisProgram, + CMDCompletion, ErrorDispatcherNotFound, Next, PackageManagerSetup, ProjectManagerSetup, + ThisProgram, display::markdown, - eprintln_cargo, + eformat_cargo, eprintln_cargo, hformat_cargo, pkg_mgr::{CMDInstall, CMDListNamespace, CMDRemoveNamespace}, res::{ResCurrentDir, ResManifestPath}, }; +use colored::Colorize; use mingling::{ Program, hook::ProgramHook, - macros::{help, program_setup}, + macros::{chain, help, pack, program_setup, r_println, renderer}, + res::ResExitCode, setup::{ExitCodeSetup, GeneralRendererSetup, HelpFlagSetup, QuietFlagSetup}, }; +use std::{env::current_dir, path::PathBuf, process::exit, str::FromStr}; pub fn run() { #[cfg(windows)] @@ -140,3 +142,35 @@ fn resolve_manifest_path(provided: Option<String>) -> PathBuf { } } } + +pack!(ResultMlingHelp = ()); +pack!(ResultUnknownCommand = String); + +#[chain] +pub fn handle_error_dispatcher_not_found(err: ErrorDispatcherNotFound) -> Next { + if err.is_empty() { + ResultMlingHelp::default().to_render() + } else { + ResultUnknownCommand::new(err.join(" ")).to_render() + } +} + +#[renderer] +pub fn render_mling_help(_prev: ResultMlingHelp, ec: &mut ResExitCode) { + r_println!("{}", markdown(include_str!("helps/mling_help.txt"))); + ec.exit_code = 0; +} + +#[renderer] +pub fn render_unknown_command(prev: ResultUnknownCommand, ec: &mut ResExitCode) { + r_println!( + "{}", + eformat_cargo!("no such command: `{}`", prev.bright_yellow().bold()) + ); + r_println!(); + r_println!( + "{}", + hformat_cargo!("view all commands with `cargo help mling`") + ); + ec.exit_code = 101; +} diff --git a/mling/src/lib.rs b/mling/src/lib.rs index add20ac..560380a 100644 --- a/mling/src/lib.rs +++ b/mling/src/lib.rs @@ -1,6 +1,5 @@ #![allow(unused_imports)] -use colored::Colorize; use mingling::{ macros::{chain, gen_program, pack, r_println, renderer}, res::ResExitCode, @@ -22,36 +21,4 @@ pub use proj_mgr::*; use crate::display::markdown; -pack!(ResultMlingHelp = ()); -pack!(ResultUnknownCommand = String); - -#[chain] -fn handle_error_dispatcher_not_found(err: ErrorDispatcherNotFound) -> Next { - if err.is_empty() { - ResultMlingHelp::default().to_render() - } else { - ResultUnknownCommand::new(err.join(" ")).to_render() - } -} - -#[renderer] -fn render_mling_help(_prev: ResultMlingHelp, ec: &mut ResExitCode) { - r_println!("{}", markdown(include_str!("helps/mling_help.txt"))); - ec.exit_code = 0; -} - -#[renderer] -fn render_unknown_command(prev: ResultUnknownCommand, ec: &mut ResExitCode) { - r_println!( - "{}", - eformat_cargo!("no such command: `{}`", prev.bright_yellow().bold()) - ); - r_println!(); - r_println!( - "{}", - hformat_cargo!("view all commands with `cargo help mling`") - ); - ec.exit_code = 101; -} - gen_program!(); diff --git a/mling/src/proj_mgr/metadata.rs b/mling/src/proj_mgr/metadata.rs index c44ed46..84da69f 100644 --- a/mling/src/proj_mgr/metadata.rs +++ b/mling/src/proj_mgr/metadata.rs @@ -5,7 +5,7 @@ use std::path::PathBuf; use std::process::Command; /// Read cargo metadata by running `cargo metadata` with the given manifest path. -pub fn read_metadata(cargo_toml: PathBuf) -> Result<CargoLockFile, std::io::Error> { +pub fn read_metadata(cargo_toml: &PathBuf) -> Result<CargoLockFile, std::io::Error> { let output = Command::new("cargo") .arg("metadata") .arg("--format-version") diff --git a/mling/src/proj_mgr/mod.rs b/mling/src/proj_mgr/mod.rs index 07a9910..3e94a3f 100644 --- a/mling/src/proj_mgr/mod.rs +++ b/mling/src/proj_mgr/mod.rs @@ -6,6 +6,9 @@ use mingling::{ pub mod metadata; +mod show_binaries; +pub use show_binaries::*; + dispatcher!("show.binaries"); dispatcher!("show.workspace"); dispatcher!("show.target-dir", diff --git a/mling/src/proj_mgr/show_binaries.rs b/mling/src/proj_mgr/show_binaries.rs new file mode 100644 index 0000000..384d8a4 --- /dev/null +++ b/mling/src/proj_mgr/show_binaries.rs @@ -0,0 +1,70 @@ +use std::path::PathBuf; + +use colored::Colorize; +use mingling::{ + Groupped, + macros::{chain, pack, r_print, r_println, renderer}, +}; +use serde::Serialize; + +use crate::{ + EntryShowBinaries, Next, + metadata::{CargoLockFile, read_metadata}, + res::ResManifestPath, +}; + +#[derive(Serialize, Groupped)] +pub struct ResultBinaries { + pub binaries: Vec<DataBinary>, +} + +#[derive(Serialize)] +pub struct DataBinary { + pub name: String, + pub path: PathBuf, +} + +#[chain] +pub fn handle_show_binaries(_args: EntryShowBinaries, manifest_path: &ResManifestPath) -> Next { + let metadata = read_metadata(manifest_path.resolved()).unwrap(); + let CargoLockFile { + packages, + workspace_members, + .. + } = metadata; + + let binaries: Vec<DataBinary> = packages + .into_iter() + .filter(|pkg| workspace_members.contains(&pkg.id)) + .flat_map(|pkg| { + pkg.targets + .into_iter() + .filter(|target| target.kind.iter().any(|k| k == "bin")) + .map(move |target| DataBinary { + name: target.name, + path: PathBuf::from(pkg.manifest_path.clone()) + .parent() + .unwrap_or(&PathBuf::from(".")) + .join("src") + .join(&target.src_path), + }) + }) + .collect(); + + ResultBinaries { binaries }.to_render() +} + +#[renderer] +pub fn render_binaries(binaries: ResultBinaries) -> String { + r_println!("{}", "Binaries:".bright_cyan().bold()); + if let Some(max_name_len) = binaries.binaries.iter().map(|b| b.name.len()).max() { + for binary in &binaries.binaries { + r_println!( + " {:width$} `{}`", + binary.name.bright_yellow().bold(), + binary.path.display().to_string().italic(), + width = max_name_len + ); + } + } +} |
