helix/dna/cmd/
tools.rs

1use clap::Args;
2use std::path::PathBuf;
3use crate::mds::tools;
4use anyhow::Result;
5
6#[derive(Args, Debug)]
7pub struct RequirementsArgs {
8    /// Target directory to analyze (defaults to current directory)
9    #[arg(short, long)]
10    pub target: Option<PathBuf>,
11
12    /// Output file path (defaults to stdout if not specified)
13    #[arg(short, long)]
14    pub output: Option<PathBuf>,
15
16    /// Only list top-level requirements (no submodules)
17    #[arg(long, default_value_t = false)]
18    pub top_level: bool,
19
20    /// Include version specifiers if available
21    #[arg(long, default_value_t = false)]
22    pub with_versions: bool,
23
24    /// Verbose output
25    #[arg(short, long, default_value_t = false)]
26    pub verbose: bool,
27}
28
29pub fn run(args: RequirementsArgs) -> Result<()> {
30    let target_dir = args.target.clone().unwrap_or_else(|| PathBuf::from("."));
31    if args.verbose {
32        println!("🔍 Analyzing Python files in: {}", target_dir.display());
33        if args.top_level {
34            println!("  Only top-level requirements will be listed.");
35        }
36        if args.with_versions {
37            println!("  Including version specifiers if available.");
38        }
39    }
40    let requirements = tools::analyze_python_files_with_options(
41        &target_dir,
42        args.top_level,
43        args.with_versions,
44        args.verbose,
45    )?;
46
47    match args.output {
48        Some(ref output_path) => {
49            std::fs::write(output_path, &requirements)?;
50            if args.verbose {
51                println!("✅ Requirements written to {}", output_path.display());
52            }
53        }
54        None => {
55            println!("{}", requirements);
56        }
57    }
58
59    Ok(())
60}