use crate::engine::{support, Ctx, ExitStatus};
use crate::error::Result;
use crate::model::PackageSource;
use crate::{i18n::Language, output};
pub(crate) fn run(ctx: &mut Ctx, name: &str, repo: bool, all: bool) -> Result<ExitStatus> {
let l = Language::current();
if !repo {
let local_pkg = ctx
.backend
.get_package_details(name, PackageSource::Installed, ctx.cfg)?;
if local_pkg.is_some() {
let mut files = ctx
.backend
.list_files(name, PackageSource::Installed, ctx.cfg)?;
files.sort();
let filtered = if all {
files
} else {
support::filter_common_dirs(&files)
};
if filtered.is_empty() {
eprintln!("{}", l.no_specific_files(name));
} else {
output::print_file_list(&filtered, ctx.fmt)?;
}
return Ok(ExitStatus::Hit);
}
eprintln!("{}", l.not_installed_searching(name));
support::show_banner(ctx.banner_shown);
match ctx
.backend
.get_package_details(name, PackageSource::Repo, ctx.cfg)?
{
Some(_) => {
eprintln!("{}", l.found_in_repo(name));
eprintln!(
"{}: {}",
l.install_cmd_label(),
support::install_cmd(ctx.backend, name)
);
Ok(ExitStatus::Hit)
}
None => {
eprintln!("{}", l.not_found_both(name));
Ok(ExitStatus::NotFound)
}
}
} else {
support::show_banner(ctx.banner_shown);
match ctx
.backend
.get_package_details(name, PackageSource::Repo, ctx.cfg)?
{
Some(_) => {
let mut files = ctx.backend.list_files(name, PackageSource::Repo, ctx.cfg)?;
files.sort();
let filtered = if all {
files
} else {
support::filter_common_dirs(&files)
};
if filtered.is_empty() {
eprintln!("{}", l.found_in_repo(name));
eprintln!(
"{}: {}",
l.install_cmd_label(),
support::install_cmd(ctx.backend, name)
);
} else {
eprintln!("{}", l.repo_file_list_header(name));
output::print_file_list(&filtered, ctx.fmt)?;
}
Ok(ExitStatus::Hit)
}
None => {
eprintln!("{}", l.not_found_repo(name));
Ok(ExitStatus::NotFound)
}
}
}
}