oxyde_cloud_cli/commands/
login.rs1use 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}