use crate::config::Config;
use crate::error::{Error, Result};
use crate::flake::parser::collect_local_packages;
use crate::profile::{get_flake_dir, get_flake_path};
use crate::state::{get_state_path, PackageState};
use super::info;
pub fn run(config: &Config) -> Result<()> {
let flake_path = get_flake_path(config);
if !flake_path.exists() {
return Err(Error::NoFlakeFound(flake_path.display().to_string()));
}
info(&format!("Packages in {}:", flake_path.display()));
let flake_dir = get_flake_dir(config)?;
let state_path = get_state_path(&flake_dir);
let state = PackageState::load(&state_path)?;
let mut packages = state.all_package_names();
let packages_dir = flake_dir.join("packages");
if packages_dir.exists() {
let (local_packages, local_flakes) = collect_local_packages(&packages_dir);
for pkg in local_packages {
if !packages.contains(&pkg.name) {
packages.push(pkg.name);
}
}
for flake in local_flakes {
if !packages.contains(&flake.name) {
packages.push(flake.name);
}
}
}
packages.sort();
if packages.is_empty() {
println!(" (none)");
} else {
for pkg in packages {
println!(" {}", pkg);
}
}
Ok(())
}