tldr_cli/commands/
structure.rs1use std::path::PathBuf;
7
8use anyhow::Result;
9use clap::Args;
10
11use tldr_core::types::CodeStructure;
12use tldr_core::{get_code_structure, IgnoreSpec, Language};
13
14use crate::commands::daemon_router::{params_with_path_lang, try_daemon_route};
15use crate::output::{format_structure_text, OutputFormat, OutputWriter};
16
17#[derive(Debug, Args)]
19pub struct StructureArgs {
20 #[arg(default_value = ".")]
22 pub path: PathBuf,
23
24 #[arg(long, short = 'l')]
26 pub lang: Option<Language>,
27
28 #[arg(long, short = 'm', default_value = "0")]
30 pub max_results: usize,
31}
32
33impl StructureArgs {
34 pub fn run(&self, format: OutputFormat, quiet: bool) -> Result<()> {
36 let writer = OutputWriter::new(format, quiet);
37
38 if !self.path.exists() {
42 anyhow::bail!("Path not found: {}", self.path.display());
43 }
44
45 let language = self
47 .lang
48 .unwrap_or_else(|| Language::from_directory(&self.path).unwrap_or(Language::Python));
49
50 if let Some(structure) = try_daemon_route::<CodeStructure>(
52 &self.path,
53 "structure",
54 params_with_path_lang(&self.path, Some(language.as_str())),
55 ) {
56 if writer.is_text() {
58 let text = format_structure_text(&structure);
59 writer.write_text(&text)?;
60 return Ok(());
61 } else {
62 writer.write(&structure)?;
63 return Ok(());
64 }
65 }
66
67 writer.progress(&format!(
69 "Extracting structure from {} ({:?})...",
70 self.path.display(),
71 language
72 ));
73
74 let structure = get_code_structure(
76 &self.path,
77 language,
78 self.max_results,
79 Some(&IgnoreSpec::default()),
80 )?;
81
82 if writer.is_text() {
84 let text = format_structure_text(&structure);
85 writer.write_text(&text)?;
86 } else {
87 writer.write(&structure)?;
88 }
89
90 Ok(())
91 }
92}