pub fn env_var_name_for_service(service: &str) -> String {
let lower = service.to_lowercase();
let curated = match lower.as_str() {
s if s.contains("aws") => Some("AWS_ACCESS_KEY_ID"),
s if s.contains("github") || s.starts_with("gh-") || s.starts_with("ghp_") => {
Some("GITHUB_TOKEN")
}
s if s.contains("gitlab") => Some("GITLAB_TOKEN"),
s if s.contains("slack") => Some("SLACK_BOT_TOKEN"),
s if s.contains("openai") => Some("OPENAI_API_KEY"),
s if s.contains("anthropic") => Some("ANTHROPIC_API_KEY"),
s if s.contains("stripe") => Some("STRIPE_SECRET_KEY"),
s if s.contains("twilio") => Some("TWILIO_AUTH_TOKEN"),
s if s.contains("sendgrid") => Some("SENDGRID_API_KEY"),
s if s.contains("google") || s.contains("gcp") => Some("GOOGLE_API_KEY"),
s if s.contains("azure") => Some("AZURE_CLIENT_SECRET"),
s if s.contains("npm") => Some("NPM_TOKEN"),
s if s.contains("pypi") => Some("PYPI_TOKEN"),
s if s.contains("docker") => Some("DOCKER_PASSWORD"),
s if s.contains("datadog") => Some("DATADOG_API_KEY"),
s if s.contains("snowflake") => Some("SNOWFLAKE_PASSWORD"),
_ => None,
};
curated
.map(|s| s.to_string())
.unwrap_or_else(|| service_to_screaming_snake(service))
}
fn service_to_screaming_snake(service: &str) -> String {
let mut out = String::with_capacity(service.len() + 4);
for ch in service.chars() {
if ch.is_ascii_alphanumeric() {
out.push(ch.to_ascii_uppercase());
} else if !out.ends_with('_') {
out.push('_');
}
}
out.trim_matches('_').to_string() + "_KEY"
}
pub fn fix_replacement_text(service: &str) -> String {
format!("${{{}}}", env_var_name_for_service(service))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn curated_services_map_correctly() {
assert_eq!(env_var_name_for_service("aws"), "AWS_ACCESS_KEY_ID");
assert_eq!(env_var_name_for_service("aws-iam"), "AWS_ACCESS_KEY_ID");
assert_eq!(env_var_name_for_service("github"), "GITHUB_TOKEN");
assert_eq!(env_var_name_for_service("openai"), "OPENAI_API_KEY");
assert_eq!(env_var_name_for_service("anthropic"), "ANTHROPIC_API_KEY");
assert_eq!(env_var_name_for_service("stripe"), "STRIPE_SECRET_KEY");
assert_eq!(env_var_name_for_service("snowflake"), "SNOWFLAKE_PASSWORD");
}
#[test]
fn unknown_service_falls_back_to_screaming_snake() {
assert_eq!(
env_var_name_for_service("acme-widget-api"),
"ACME_WIDGET_API_KEY"
);
assert_eq!(env_var_name_for_service("RevenueCat"), "REVENUECAT_KEY");
}
#[test]
fn fix_replacement_text_wraps_in_dollar_braces() {
assert_eq!(fix_replacement_text("aws"), "${AWS_ACCESS_KEY_ID}");
assert_eq!(fix_replacement_text("acme-x"), "${ACME_X_KEY}");
}
#[test]
fn empty_service_does_not_panic() {
assert_eq!(env_var_name_for_service(""), "_KEY");
}
}