use std::fmt::Write;
use std::path::Path;
use anyhow::{Result, bail};
use owo_colors::OwoColorize;
use uv_cache::Cache;
use uv_fs::Simplified;
use uv_normalize::PackageName;
use uv_workspace::{DiscoveryOptions, Workspace, WorkspaceCache};
use crate::commands::ExitStatus;
use crate::printer::Printer;
pub(crate) async fn dir(
package_name: Option<PackageName>,
project_dir: &Path,
cache: &Cache,
workspace_cache: &WorkspaceCache,
printer: Printer,
) -> Result<ExitStatus> {
let workspace = Workspace::discover(
project_dir,
&DiscoveryOptions::default(),
cache,
workspace_cache,
)
.await?;
let dir = match package_name {
None => workspace.install_path(),
Some(package) => {
if let Some(p) = workspace.packages().get(&package) {
p.root()
} else {
bail!("Package `{package}` not found in workspace.")
}
}
};
writeln!(printer.stdout(), "{}", dir.simplified_display().cyan())?;
Ok(ExitStatus::Success)
}