oxyde_cloud_cli/commands/
login.rs

1use crate::api_key::api_key_entry;
2use crate::commands::logout;
3use crate::commands::logout::logout;
4use cliclack::log::remark;
5use cliclack::{input, intro, outro, outro_cancel, spinner};
6use oxyde_cloud_client::Client;
7use thiserror::Error;
8
9#[derive(Debug, Error)]
10pub enum Error {
11    #[error("IO error: {0}")]
12    Io(#[from] std::io::Error),
13    #[error("Keyring error: {0}")]
14    Keyring(#[from] keyring::Error),
15    #[error("Logout error: {0}")]
16    Logout(#[from] logout::Error),
17}
18
19pub async fn login() -> Result<(), Error> {
20    intro("Login")?;
21
22    let keyring_entry = api_key_entry()?;
23
24    if keyring_entry.get_password().is_ok() {
25        outro("You're already logged in.")?;
26        return Ok(());
27    }
28
29    remark("Get your API-Key from https://oxyde.cloud/dashboard/profile/api-key")?;
30
31    let api_key: String = input("Paste your API key")
32        .placeholder("ABCD-efgh-IJKL-mnop")
33        .interact()?;
34
35    let api_key = api_key.trim().to_string();
36
37    keyring_entry.set_password(&api_key)?;
38
39    let spinner = spinner();
40    spinner.start("Logging in...");
41
42    match Client::new(api_key).login().await {
43        Ok(login_result) => {
44            spinner.stop("Done!");
45            outro(format!(
46                "You're now logged in as {}.",
47                login_result.username
48            ))?;
49        }
50        Err(err) => {
51            logout()?;
52
53            spinner.error("Failed!");
54            outro_cancel(format!("Failed to login: {err}"))?;
55        }
56    }
57
58    Ok(())
59}