use std::path::PathBuf;
use anyhow::Result;
use clap::Args;
use colored::Colorize;
use tldr_core::types::ImportInfo;
use tldr_core::{detect_or_parse_language, get_imports, Language};
use crate::commands::daemon_router::{params_with_file, try_daemon_route};
use crate::output::{format_imports_text, OutputFormat, OutputWriter};
#[derive(Debug, Args)]
pub struct ImportsArgs {
pub file: PathBuf,
#[arg(long, short = 'l')]
pub lang: Option<Language>,
}
impl ImportsArgs {
pub fn run(&self, format: OutputFormat, quiet: bool) -> Result<()> {
let writer = OutputWriter::new(format, quiet);
let project = self.file.parent().unwrap_or(&self.file);
if let Some(result) =
try_daemon_route::<Vec<ImportInfo>>(project, "imports", params_with_file(&self.file))
{
if writer.is_text() {
writer.write_text(&format!(
"{} ({} imports)\n\n{}",
self.file.display().to_string().bold(),
result.len(),
format_imports_text(&result),
))?;
} else {
writer.write(&result)?;
}
return Ok(());
}
let language =
detect_or_parse_language(self.lang.as_ref().map(|l| l.as_str()), &self.file)?;
writer.progress(&format!(
"Parsing imports from {} ({:?})...",
self.file.display(),
language
));
let result = get_imports(&self.file, language)?;
if writer.is_text() {
writer.write_text(&format!(
"{} ({} imports)\n\n{}",
self.file.display().to_string().bold(),
result.len(),
format_imports_text(&result),
))?;
} else {
writer.write(&result)?;
}
Ok(())
}
}