sync_auth/providers/
opencode.rs1use crate::{AuthProvider, CredentialFile, ValidationResult};
4use std::path::PathBuf;
5
6#[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}