aboutsummaryrefslogtreecommitdiff
path: root/mling/src/proj_mgr/show_binaries.rs
diff options
context:
space:
mode:
Diffstat (limited to 'mling/src/proj_mgr/show_binaries.rs')
-rw-r--r--mling/src/proj_mgr/show_binaries.rs70
1 files changed, 70 insertions, 0 deletions
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
+ );
+ }
+ }
+}