use crate::error::SynqroError;
#[cfg(target_os = "linux")]
mod linux;
#[cfg(target_os = "macos")]
mod macos;
#[cfg(target_os = "windows")]
mod windows;
#[cfg(target_os = "android")]
mod android;
#[cfg(target_os = "ios")]
mod ios;
pub const SYNQRO_KEYCHAIN_SERVICE: &str = "synqro";
pub const SYNQRO_TOKEN_ACCOUNT: &str = "github_token";
pub const SYNQRO_TELEGRAM_ACCOUNT: &str = "telegram_token";
pub trait KeychainProvider: Send + Sync {
fn load_secret(&self, service: &str, account: &str) -> Result<Vec<u8>, SynqroError>;
fn store_secret(&self, service: &str, account: &str, secret: &[u8]) -> Result<(), SynqroError>;
fn delete_secret(&self, service: &str, account: &str) -> Result<(), SynqroError>;
}
pub fn platform_keychain() -> Result<Box<dyn KeychainProvider>, SynqroError> {
#[cfg(target_os = "linux")]
{
let provider = linux::LinuxKeychain::new()?;
return Ok(Box::new(provider));
}
#[cfg(target_os = "macos")]
{
let provider = macos::MacosKeychain::new()?;
return Ok(Box::new(provider));
}
#[cfg(target_os = "windows")]
{
let provider = windows::WindowsKeychain::new()?;
return Ok(Box::new(provider));
}
#[cfg(target_os = "android")]
{
let provider = android::AndroidKeychain::new()?;
return Ok(Box::new(provider));
}
#[cfg(target_os = "ios")]
{
let provider = ios::IosKeychain::new()?;
return Ok(Box::new(provider));
}
#[allow(unreachable_code)]
Err(SynqroError::Permission("unsupported platform".into()))
}