greppy/auth/
mod.rs

1pub mod anthropic;
2pub mod google;
3pub mod server;
4pub mod storage;
5
6use crate::core::error::{Error, Result};
7pub use storage::Provider;
8
9/// Login with Google (Gemini) via OAuth
10pub async fn login_google() -> Result<()> {
11    println!("Initiating Google OAuth login...");
12    let token = google::authenticate().await.map_err(Error::Auth)?;
13    storage::save_token(Provider::Google, &token).map_err(Error::Auth)?;
14    println!("Successfully logged in with Google!");
15    Ok(())
16}
17
18/// Login with Anthropic (Claude) via OAuth
19pub async fn login_anthropic() -> Result<()> {
20    println!("Initiating Claude OAuth login...");
21    let token = anthropic::authenticate().await.map_err(Error::Auth)?;
22    storage::save_token(Provider::Anthropic, &token).map_err(Error::Auth)?;
23    println!("Successfully logged in with Claude!");
24    Ok(())
25}
26
27/// Legacy login function (defaults to Google OAuth)
28pub async fn login() -> Result<()> {
29    login_google().await
30}
31
32/// Logout from a specific provider
33pub fn logout_provider(provider: Provider) -> Result<()> {
34    storage::delete_token(provider).map_err(Error::Auth)?;
35    println!("Logged out from {:?}.", provider);
36    Ok(())
37}
38
39/// Logout from all providers
40pub fn logout() -> Result<()> {
41    storage::delete_all_tokens().map_err(Error::Auth)?;
42    println!("Logged out from all providers.");
43    Ok(())
44}
45
46/// Get token for a specific provider
47pub fn get_token(provider: Provider) -> Result<String> {
48    storage::load_token(provider).map_err(Error::Auth)
49}
50
51/// Get Google token (for Gemini)
52pub fn get_google_token() -> Result<String> {
53    get_token(Provider::Google)
54}
55
56/// Get Anthropic token (for Claude)
57pub fn get_anthropic_token() -> Result<String> {
58    get_token(Provider::Anthropic)
59}
60
61/// Check which providers are authenticated
62pub fn get_authenticated_providers() -> Vec<Provider> {
63    let mut providers = Vec::new();
64    if storage::has_token(Provider::Google) {
65        providers.push(Provider::Google);
66    }
67    if storage::has_token(Provider::Anthropic) {
68        providers.push(Provider::Anthropic);
69    }
70    providers
71}