Skip to main content

sync_auth/providers/
opencode.rs

1//! Opencode auth provider.
2
3use crate::{AuthProvider, CredentialFile, ValidationResult};
4use std::path::PathBuf;
5
6/// Provider for opencode credentials.
7///
8/// Opencode stores auth in `~/.local/share/opencode/auth.json` (XDG data dir)
9/// and config/plugins in `~/.config/opencode/`.
10#[derive(Debug, Clone, Default)]
11pub struct OpencodeProvider;
12
13#[async_trait::async_trait]
14impl AuthProvider for OpencodeProvider {
15    fn name(&self) -> &str {
16        "opencode"
17    }
18
19    fn display_name(&self) -> &str {
20        "Opencode"
21    }
22
23    fn credential_files(&self) -> Vec<CredentialFile> {
24        let data_dir = dirs::data_local_dir()
25            .unwrap_or_else(|| {
26                dirs::home_dir()
27                    .unwrap_or_else(|| PathBuf::from("~"))
28                    .join(".local/share")
29            })
30            .join("opencode");
31        let config_dir = dirs::config_dir()
32            .unwrap_or_else(|| {
33                dirs::home_dir()
34                    .unwrap_or_else(|| PathBuf::from("~"))
35                    .join(".config")
36            })
37            .join("opencode");
38        vec![
39            CredentialFile {
40                relative_path: "opencode/data".to_string(),
41                local_path: data_dir,
42                is_dir: true,
43            },
44            CredentialFile {
45                relative_path: "opencode/config".to_string(),
46                local_path: config_dir,
47                is_dir: true,
48            },
49        ]
50    }
51
52    async fn validate(&self) -> ValidationResult {
53        let data_dir = dirs::data_local_dir()
54            .unwrap_or_else(|| {
55                dirs::home_dir()
56                    .unwrap_or_else(|| PathBuf::from("~"))
57                    .join(".local/share")
58            })
59            .join("opencode");
60        if data_dir.join("auth.json").exists() {
61            ValidationResult::Valid
62        } else {
63            ValidationResult::Missing
64        }
65    }
66}