From 881e7399b2417c32fa996d94c6b389c1e06d8eb1 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Tue, 28 Apr 2026 16:18:12 +0800 Subject: Add scaffolding CLI tool `mling` --- mling/src/cli/read.rs | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 mling/src/cli/read.rs (limited to 'mling/src/cli/read.rs') 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, +} + +#[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; + } +} -- cgit