use std::sync::OnceLock;
static TOKEN_CACHE: OnceLock<Option<String>> = OnceLock::new();
pub fn discover_token() -> Option<&'static str> {
TOKEN_CACHE
.get_or_init(discover_token_uncached)
.as_deref()
}
pub fn discover_token_uncached() -> Option<String> {
if let Ok(t) = std::env::var("GITHUB_TOKEN") {
if !t.is_empty() {
return Some(t);
}
}
if let Ok(t) = std::env::var("GH_TOKEN") {
if !t.is_empty() {
return Some(t);
}
}
let out = std::process::Command::new("gh")
.args(["auth", "token"])
.output()
.ok()?;
if !out.status.success() {
return None;
}
let s = String::from_utf8(out.stdout).ok()?.trim().to_string();
if s.is_empty() {
None
} else {
Some(s)
}
}