use crate::github;
use crate::tokens;
use eyre::bail;
#[derive(Debug, usage_rs::Args)]
#[usage(
verbatim_doc_comment,
example(
r###"mise token github
github.com: ghp_…xxxx (source: GITHUB_TOKEN)"###
),
example(
r###"mise token github --unmask
github.com: ghp_xxxxxxxxxxxx (source: GITHUB_TOKEN)"###
),
example(
r###"mise token github github.mycompany.com
github.mycompany.com: (none)"###
),
example(
r###"mise token github --oauth --refresh
github.com: gho_…xxxx (source: GitHub OAuth)"###
)
)]
pub(crate) struct Github {
#[usage(default = "github.com")]
pub(crate) host: String,
#[usage(long, hide = true)]
pub(crate) git_credential: Option<String>,
#[usage(long)]
pub(crate) oauth: bool,
#[usage(long)]
pub(crate) raw: bool,
#[usage(long, requires = "oauth")]
pub(crate) refresh: bool,
#[usage(long)]
pub(crate) unmask: bool,
}
impl Github {
pub(crate) fn run(self) -> eyre::Result<()> {
if let Some(operation) = &self.git_credential {
return super::git_credential::run(operation);
}
let resolved = if self.oauth {
Some((
github::oauth::token(github::oauth::TokenRequest {
host: self.host.clone(),
allow_device_flow: true,
force_refresh: self.refresh,
..Default::default()
})?,
github::TokenSource::GithubOauth,
))
} else {
github::resolve_token(&self.host)
};
match resolved {
Some((token, source)) => {
if self.raw {
miseprintln!("{token}");
return Ok(());
}
let display_token = if self.unmask {
token
} else {
tokens::mask_token(&token)
};
miseprintln!("{}: {} (source: {})", self.host, display_token, source);
}
None => {
if self.raw {
bail!("no GitHub token found for {}", self.host);
}
miseprintln!("{}: (none)", self.host);
}
}
Ok(())
}
}