use crate::error::Origin;
pub(crate) fn without_backticked_values(message: &str) -> String {
let leaky = message.contains("invalid type:") || message.contains("invalid value:");
if !leaky {
return message.to_owned();
}
let mut out = String::with_capacity(message.len());
let mut rest = message;
loop {
let tick = rest.find('`');
let quote = rest.find('"');
let (open, mark) = match (tick, quote) {
(Some(t), Some(q)) if t < q => (t, '`'),
(Some(t), None) => (t, '`'),
(_, Some(q)) => (q, '"'),
(None, None) => break,
};
let Some(close) = rest[open + 1..].find(mark) else {
break;
};
out.push_str(&rest[..open]);
out.push(mark);
out.push_str("<redacted>");
out.push(mark);
rest = &rest[open + 1 + close + 1..];
}
out.push_str(rest);
out
}
pub(super) fn refine_env<'a>(
origin: Origin,
path: impl Iterator<Item = &'a str>,
nest: &str,
) -> Origin {
let Origin::Env(prefix) = &origin else {
return origin;
};
let Some(stem) = prefix.strip_suffix('*') else {
return origin;
};
let segments: Vec<String> = path.map(str::to_ascii_uppercase).collect();
if segments.is_empty() {
return origin;
}
let variable = format!("{stem}{}", segments.join(&nest.to_ascii_uppercase()));
if std::env::var_os(&variable).is_none() {
return origin;
}
Origin::Env(variable)
}