use std::path::PathBuf;
use anyhow::Result;
use clap::Args;
use tldr_core::types::CodeStructure;
use tldr_core::{get_code_structure, IgnoreSpec, Language};
use crate::commands::daemon_router::{params_with_path_lang, try_daemon_route};
use crate::output::{format_structure_text, OutputFormat, OutputWriter};
#[derive(Debug, Args)]
pub struct StructureArgs {
#[arg(default_value = ".")]
pub path: PathBuf,
#[arg(long, short = 'l')]
pub lang: Option<Language>,
#[arg(long, short = 'm', default_value = "0")]
pub max_results: usize,
}
impl StructureArgs {
pub fn run(&self, format: OutputFormat, quiet: bool) -> Result<()> {
let writer = OutputWriter::new(format, quiet);
let language = self
.lang
.unwrap_or_else(|| Language::from_directory(&self.path).unwrap_or(Language::Python));
if let Some(structure) = try_daemon_route::<CodeStructure>(
&self.path,
"structure",
params_with_path_lang(&self.path, Some(language.as_str())),
) {
if writer.is_text() {
let text = format_structure_text(&structure);
writer.write_text(&text)?;
return Ok(());
} else {
writer.write(&structure)?;
return Ok(());
}
}
writer.progress(&format!(
"Extracting structure from {} ({:?})...",
self.path.display(),
language
));
let structure = get_code_structure(
&self.path,
language,
self.max_results,
Some(&IgnoreSpec::default()),
)?;
if writer.is_text() {
let text = format_structure_text(&structure);
writer.write_text(&text)?;
} else {
writer.write(&structure)?;
}
Ok(())
}
}