aboutsummaryrefslogtreecommitdiff
path: root/mling
diff options
context:
space:
mode:
Diffstat (limited to 'mling')
-rw-r--r--mling/Cargo.toml2
-rw-r--r--mling/src/cli.rs44
-rw-r--r--mling/src/lib.rs33
-rw-r--r--mling/src/proj_mgr/metadata.rs2
-rw-r--r--mling/src/proj_mgr/mod.rs3
-rw-r--r--mling/src/proj_mgr/show_binaries.rs70
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
+ );
+ }
+ }
+}