1use clap::Args;
2use std::path::PathBuf;
3use crate::mds::tools;
4use anyhow::Result;
5
6#[derive(Args, Debug)]
7pub struct RequirementsArgs {
8 #[arg(short, long)]
10 pub target: Option<PathBuf>,
11
12 #[arg(short, long)]
14 pub output: Option<PathBuf>,
15
16 #[arg(long, default_value_t = false)]
18 pub top_level: bool,
19
20 #[arg(long, default_value_t = false)]
22 pub with_versions: bool,
23
24 #[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}