generated from pure_sagacity/rust-starter
added credential management to keyring.
cursor.
This commit is contained in:
+11
-58
@@ -1,21 +1,22 @@
|
||||
use crate::{config::parse_config, providers::Provider, tui::user_select_repo};
|
||||
use colored::*;
|
||||
use clap::Parser;
|
||||
use dialoguer::{Select, theme::ColorfulTheme};
|
||||
use std::io::Write;
|
||||
use std::{io, process};
|
||||
use std::io;
|
||||
|
||||
mod cli;
|
||||
mod config;
|
||||
mod credentials;
|
||||
mod providers;
|
||||
mod tui;
|
||||
|
||||
const CONFIG_PATH: &str = "~/.config/clonee";
|
||||
pub(crate) const CONFIG_PATH: &str = "~/.config/clonee";
|
||||
|
||||
enum DefaultAnswer {
|
||||
pub(crate) enum DefaultAnswer {
|
||||
Yes,
|
||||
No,
|
||||
}
|
||||
|
||||
fn ask_option<T>(message: &str, options: Vec<T>) -> T
|
||||
pub(crate) fn ask_option<T>(message: &str, options: Vec<T>) -> T
|
||||
where
|
||||
T: std::fmt::Display + Clone,
|
||||
{
|
||||
@@ -29,14 +30,13 @@ where
|
||||
options[selection].clone()
|
||||
}
|
||||
|
||||
fn ask_yes_no(message: &str, default: Option<DefaultAnswer>) -> bool {
|
||||
pub(crate) fn ask_yes_no(message: &str, default: Option<DefaultAnswer>) -> bool {
|
||||
let options: Vec<&str> = match default {
|
||||
Some(DefaultAnswer::Yes) => vec!["Yes", "No"],
|
||||
Some(DefaultAnswer::No) => vec!["No", "Yes"],
|
||||
None => vec!["Yes", "No"],
|
||||
};
|
||||
|
||||
// &str implements both Display and Copy!
|
||||
match ask_option(message, options) {
|
||||
"Yes" => true,
|
||||
"No" => false,
|
||||
@@ -44,7 +44,7 @@ fn ask_yes_no(message: &str, default: Option<DefaultAnswer>) -> bool {
|
||||
}
|
||||
}
|
||||
|
||||
fn get_input(message: &str) -> String {
|
||||
pub(crate) fn get_input(message: &str) -> String {
|
||||
print!("{}", message);
|
||||
io::stdout().flush().unwrap();
|
||||
|
||||
@@ -56,53 +56,6 @@ fn get_input(message: &str) -> String {
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let config_file = format!("{}/config.toml", CONFIG_PATH);
|
||||
let config = match parse_config(config_file.clone()).await {
|
||||
Ok(c) => c,
|
||||
Err(e) => {
|
||||
let top = "Failed to parse config.".red();
|
||||
let bottom = "Maybe there's an error in the config?".dimmed();
|
||||
|
||||
println!("{}\n{}", top, bottom);
|
||||
eprintln!("Error at {}: {}", config_file, e);
|
||||
process::exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
let selected_provider = ask_option("Choose a provider:", config.provider);
|
||||
|
||||
let provider: crate::config::ProviderClient = selected_provider.into_provider_trait();
|
||||
|
||||
let repos = provider.repositories().await.expect("Failed to get repos.");
|
||||
|
||||
let selection = match user_select_repo(repos).await {
|
||||
Ok(r) => r,
|
||||
Err(_) => {
|
||||
println!("{}", "No repository was selected!".red());
|
||||
process::exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
match ask_yes_no("Clone the repo?", Some(DefaultAnswer::Yes)) {
|
||||
true => {
|
||||
let folder: Option<String> =
|
||||
if ask_yes_no("Use a custom folder?", Some(DefaultAnswer::No)) {
|
||||
let custom = get_input("Folder name: ");
|
||||
Some(custom)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
match provider.clone(selection, folder, false).await {
|
||||
Ok(_) => println!("Repo cloned!"),
|
||||
Err(_) => {
|
||||
println!("{}", "Error cloning repo.".red())
|
||||
}
|
||||
}
|
||||
}
|
||||
false => {
|
||||
println!("Exiting...");
|
||||
process::exit(0);
|
||||
}
|
||||
}
|
||||
let cli = cli::Cli::parse();
|
||||
cli::run(cli).await;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user