diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-04-28 16:18:12 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-04-28 16:18:12 +0800 |
| commit | 881e7399b2417c32fa996d94c6b389c1e06d8eb1 (patch) | |
| tree | fd88cb181e9c5a0bae8677c43dff859f4cd82d80 /mling/src/cli/read.rs | |
| parent | dbc811d84fd809ea606a8bbed84b3e78e8cda334 (diff) | |
Add scaffolding CLI tool `mling`
Diffstat (limited to 'mling/src/cli/read.rs')
| -rw-r--r-- | mling/src/cli/read.rs | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/mling/src/cli/read.rs b/mling/src/cli/read.rs new file mode 100644 index 0000000..8717932 --- /dev/null +++ b/mling/src/cli/read.rs @@ -0,0 +1,77 @@ +use colored::Colorize; +use std::path::PathBuf; + +use mingling::{ + Groupped, + macros::{chain, dispatcher, pack, r_println, renderer}, +}; +use serde::Serialize; + +use crate::{ + ThisProgram, + project_solver::{BinaryItem, solve_current_dir}, +}; + +dispatcher!("show-target-dir", ReadTargetDirCommand => ReadTargetDirEntry); +dispatcher!("show-workspace-root", ReadWorkspaceRootCommand => ReadWorkspaceRootEntry); +dispatcher!("show-binaries", ReadBinariesCommand => ReadBinariesEntry); + +pack!(ResultDir = PathBuf); +pack!(ResultTargetDirNotFound = ()); + +#[derive(Debug, Serialize, Default, Groupped)] +pub(crate) struct ResultBinaries { + bin: Vec<BinaryItem>, +} + +#[chain] +pub(crate) fn handle_target_dir_entry(_prev: ReadTargetDirEntry) -> NextProcess { + match solve_current_dir() { + Ok(solved) => { + let dir = solved.target_dir; + ResultDir::new(dir).to_render() + } + Err(_) => ResultTargetDirNotFound::new(()).to_render(), + } +} + +#[chain] +pub(crate) fn handle_workspace_root_entry(_prev: ReadWorkspaceRootEntry) -> NextProcess { + match solve_current_dir() { + Ok(solved) => { + let dir = solved.workspace_root; + ResultDir::new(dir).to_render() + } + Err(_) => ResultTargetDirNotFound::new(()).to_render(), + } +} + +#[chain] +pub(crate) fn handle_binaries_entry(_prev: ReadBinariesEntry) -> NextProcess { + match solve_current_dir() { + Ok(solved) => { + let binaries = solved.binaries; + ResultBinaries { bin: binaries }.to_render() + } + Err(_) => ResultTargetDirNotFound::new(()).to_render(), + } +} + +#[renderer] +pub(crate) fn render_dir(prev: ResultDir) { + r_println!("{}", prev.inner.display()) +} + +#[renderer] +pub(crate) fn render_binaries(prev: ResultBinaries) { + let mut i = 1; + for item in prev.bin.iter() { + r_println!( + "{}. {} ({})", + i.to_string(), + item.name.bold(), + item.path.to_string_lossy().underline().bright_cyan() + ); + i += 1; + } +} |
