Skip to main content

sync_auth/providers/
gh.rs

1//! GitHub CLI (`gh`) auth provider.
2
3use crate::{AuthProvider, CredentialFile, ValidationResult};
4
5/// Provider for GitHub CLI credentials (`~/.config/gh/`).
6#[derive(Debug, Clone, Default)]
7pub struct GhProvider;
8
9#[async_trait::async_trait]
10impl AuthProvider for GhProvider {
11    fn name(&self) -> &str {
12        "gh"
13    }
14
15    fn display_name(&self) -> &str {
16        "GitHub CLI"
17    }
18
19    fn credential_files(&self) -> Vec<CredentialFile> {
20        let base = dirs::config_dir()
21            .unwrap_or_else(|| "~/.config".into())
22            .join("gh");
23        vec![CredentialFile {
24            relative_path: "gh".to_string(),
25            local_path: base,
26            is_dir: true,
27        }]
28    }
29
30    async fn validate(&self) -> ValidationResult {
31        match tokio::process::Command::new("gh")
32            .args(["auth", "status"])
33            .output()
34            .await
35        {
36            Ok(output) if output.status.success() => ValidationResult::Valid,
37            Ok(_) => ValidationResult::Expired,
38            Err(_) => ValidationResult::Unknown,
39        }
40    }
41}