Skip to main content

sync_auth/providers/
glab.rs

1//! GitLab CLI (`glab`) auth provider.
2
3use crate::{AuthProvider, CredentialFile, ValidationResult};
4
5/// Provider for GitLab CLI credentials (`~/.config/glab-cli/`).
6#[derive(Debug, Clone, Default)]
7pub struct GlabProvider;
8
9#[async_trait::async_trait]
10impl AuthProvider for GlabProvider {
11    fn name(&self) -> &str {
12        "glab"
13    }
14
15    fn display_name(&self) -> &str {
16        "GitLab CLI"
17    }
18
19    fn credential_files(&self) -> Vec<CredentialFile> {
20        let base = dirs::config_dir()
21            .unwrap_or_else(|| "~/.config".into())
22            .join("glab-cli");
23        vec![CredentialFile {
24            relative_path: "glab-cli".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("glab")
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}