use clap::Values; use crate::commands::clone::get_url_props; use crate::services::api::ApiError::RequestError; use crate::services::login::Login; use crate::services::api_call::ApiCall; use crate::commands::config; pub struct CredentialArgs<'a> { pub username: Option>, pub password: Option>, } pub fn credential_add(args: CredentialArgs) { // get remote if exists let remote = match config::get_remote("origin") { None => { eprintln!("fatal: No remote origin, impossible to send request to get token"); std::process::exit(1); }, Some(remote) => remote }; let (host, _, _) = get_url_props(&remote); // get username and password let username = args.username.unwrap().next().unwrap(); let password = match args.password { Some(mut pwd) => pwd.next().unwrap().to_owned(), None => { println!("Please enter the password for {}: ", username); rpassword::read_password().unwrap() } }; // get token let get_token = Login::new() .set_auth(username, &password) .set_host(Some(host)) .send_login(); // deal with error if let Err(err) = get_token { if let RequestError(err) = err { eprintln!("fatal: Failed to get token for these credential. ({})", err); } else { eprintln!("fatal: Failed to get token for these credential."); } std::process::exit(1); } // save token let _ = config::write_option_in_cat("core", "token", get_token.unwrap().as_str()); }