use super::{
ListLocation, read_merged, read_single, resolve_aliases, setting_default_value,
setting_for_key, user_npmrc_path,
};
use clap::Args;
#[derive(Debug, Args)]
pub struct GetArgs {
pub key: String,
#[arg(long)]
pub json: bool,
#[arg(long, conflicts_with = "location")]
pub local: bool,
#[arg(long, value_enum, default_value_t = ListLocation::Merged)]
pub location: ListLocation,
}
impl GetArgs {
fn effective_location(&self) -> ListLocation {
if self.local {
ListLocation::Project
} else {
self.location
}
}
}
pub fn run(args: GetArgs) -> miette::Result<()> {
let aliases = resolve_aliases(&args.key);
let cwd = crate::dirs::project_root_or_cwd()?;
let entries: Vec<(String, String)> = match args.effective_location() {
ListLocation::Merged => read_merged(&cwd)?,
ListLocation::User | ListLocation::Global => {
let mut entries = read_single(&user_npmrc_path()?)?;
entries.extend(super::aube_config::load_user_entries());
entries
}
ListLocation::Project => {
let mut entries = super::read_workspace_yaml_flat(&cwd);
entries.extend(read_single(&cwd.join(".npmrc"))?);
entries.extend(super::aube_config::load_project_entries(&cwd));
entries
}
};
let managed_entries = super::aube_config::load_managed_entries();
if matches!(args.effective_location(), ListLocation::Merged)
&& !managed_entries.is_empty()
&& let Some(meta) = setting_for_key(&args.key)
{
let local = entries
.iter()
.rev()
.find_map(|(k, v)| aliases.iter().any(|a| a == k).then(|| v.clone()));
if let Some(v) = aube_settings::values::apply_managed_raw(
meta.name,
local.or_else(|| setting_default_value(meta)),
&managed_entries,
) {
if args.json {
println!("{}", serde_json::Value::String(v));
} else {
println!("{v}");
}
return Ok(());
}
}
for (k, v) in entries.iter().rev() {
if aliases.iter().any(|a| a == k) {
if args.json {
println!("{}", serde_json::Value::String(v.clone()));
} else {
println!("{v}");
}
return Ok(());
}
}
println!("undefined");
Ok(())
}