aboutsummaryrefslogtreecommitdiffstats
path: root/crates/atuin/src/command/client/account/link.rs
blob: 69c4eebe2e4122043aa2040adaff73eca84df8db (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use eyre::{Result, bail};

use atuin_client::settings::Settings;

pub async fn run(settings: &Settings) -> Result<()> {
    let meta = Settings::meta_store().await?;

    let cli_token = meta.session_token().await?;
    let hub_token = meta.hub_session_token().await?;

    let Some(cli_token) = cli_token else {
        bail!("No CLI session found. Please log in first with 'atuin login'.");
    };

    let hub_address = settings.active_hub_endpoint().unwrap_or_default();

    if hub_token.is_some() {
        println!("Found both Hub and CLI sessions. Linking accounts...");
    } else {
        println!("Found CLI session but no Hub session. Logging in to Hub first...");

        let session = atuin_client::hub::HubAuthSession::start(hub_address.as_ref()).await?;
        println!("Open this URL to authenticate with Atuin Hub:");
        println!("{}", session.auth_url);

        let token = session
            .wait_for_completion(
                atuin_client::hub::DEFAULT_AUTH_TIMEOUT,
                atuin_client::hub::DEFAULT_POLL_INTERVAL,
            )
            .await?;

        atuin_client::hub::save_session(&token).await?;
        println!("Hub authentication complete.");
    }

    atuin_client::hub::link_account(hub_address.as_ref(), &cli_token).await?;
    println!("Successfully linked CLI account to Hub.");

    Ok(())
}