tldr_cli/commands/
whatbreaks.rs1use std::path::PathBuf;
18
19use anyhow::Result;
20use clap::{Args, ValueEnum};
21
22use tldr_core::analysis::whatbreaks::{whatbreaks_analysis, TargetType, WhatbreaksOptions};
23use tldr_core::Language;
24
25use crate::output::{format_whatbreaks_text, OutputFormat, OutputWriter};
26use crate::path_validation::require_directory;
27
28#[derive(Debug, Clone, Copy, ValueEnum)]
30pub enum TargetTypeArg {
31 Function,
33 File,
35 Module,
37}
38
39impl From<TargetTypeArg> for TargetType {
40 fn from(arg: TargetTypeArg) -> Self {
41 match arg {
42 TargetTypeArg::Function => TargetType::Function,
43 TargetTypeArg::File => TargetType::File,
44 TargetTypeArg::Module => TargetType::Module,
45 }
46 }
47}
48
49#[derive(Debug, Args)]
54pub struct WhatbreaksArgs {
55 pub target: String,
57
58 #[arg(default_value = ".")]
60 pub path: PathBuf,
61
62 #[arg(long = "type", short = 't', value_enum)]
64 pub target_type: Option<TargetTypeArg>,
65
66 #[arg(long, short = 'd', default_value = "3")]
68 pub depth: usize,
69
70 #[arg(long)]
72 pub quick: bool,
73
74 #[arg(long, short = 'l')]
76 pub lang: Option<Language>,
77}
78
79impl WhatbreaksArgs {
80 pub fn run(&self, format: OutputFormat, quiet: bool) -> Result<()> {
82 let writer = OutputWriter::new(format, quiet);
83
84 require_directory(&self.path, "whatbreaks")?;
87
88 writer.progress(&format!(
89 "Analyzing what breaks if '{}' changes...",
90 self.target
91 ));
92
93 let options = WhatbreaksOptions {
95 depth: self.depth,
96 quick: self.quick,
97 language: self.lang,
98 force_type: self.target_type.map(|t| t.into()),
99 };
100
101 let report = whatbreaks_analysis(&self.target, &self.path, &options)?;
103
104 writer.progress(&format!(
105 "Target type: {} ({})",
106 report.target_type, report.detection_reason
107 ));
108
109 if writer.is_text() {
111 let text = format_whatbreaks_text(&report);
112 writer.write_text(&text)?;
113 } else {
114 writer.write(&report)?;
115 }
116
117 Ok(())
118 }
119}