use crate::error::{GistError, Result};
pub fn resolve_token() -> Result<String> {
if let Ok(token) = std::env::var("GITHUB_TOKEN")
&& !token.is_empty()
{
return Ok(token);
}
let Ok(output) = std::process::Command::new("gh")
.args(["auth", "token"])
.output()
else {
return Err(GistError::NoToken);
};
if output.status.success() {
let token = String::from_utf8_lossy(&output.stdout).trim().to_string();
if !token.is_empty() {
return Ok(token);
}
}
Err(GistError::NoToken)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resolve_token_prefers_a_nonempty_env_var() {
let saved = std::env::var("GITHUB_TOKEN").ok();
unsafe { std::env::set_var("GITHUB_TOKEN", "tok_from_env") };
assert_eq!(resolve_token().unwrap(), "tok_from_env");
unsafe { std::env::set_var("GITHUB_TOKEN", "") };
if let Ok(t) = resolve_token() {
assert!(!t.is_empty());
}
match saved {
Some(v) => unsafe { std::env::set_var("GITHUB_TOKEN", v) },
None => unsafe { std::env::remove_var("GITHUB_TOKEN") },
}
}
}