diff --git a/Cargo.lock b/Cargo.lock index 4c898d9..98df0f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1024,6 +1024,19 @@ dependencies = [ "memchr", ] +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + [[package]] name = "const-fnv1a-hash" version = "1.1.0" @@ -1252,6 +1265,19 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "dialoguer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console", + "shell-words", + "tempfile", + "thiserror", + "zeroize", +] + [[package]] name = "digest" version = "0.10.7" @@ -1337,6 +1363,12 @@ dependencies = [ "log", ] +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -3352,6 +3384,12 @@ dependencies = [ "keccak", ] +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + [[package]] name = "shellexpand" version = "3.1.0" @@ -3417,6 +3455,7 @@ dependencies = [ "axum", "clap", "ctrlc", + "dialoguer", "env_logger", "graphql_client", "hyper", @@ -4184,6 +4223,12 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + [[package]] name = "unicode-xid" version = "0.2.4" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 48a6fdc..58220c3 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -13,6 +13,7 @@ anyhow.workspace = true axum.workspace = true clap = { version = "4.2", features = ["derive"] } ctrlc = "3.4.1" +dialoguer = "0.11.0" env_logger = "0.10" log = "0.4" graphql_client.workspace = true diff --git a/cli/src/command/deployments/delete.rs b/cli/src/command/deployments/delete.rs index c4d71ab..61d3932 100644 --- a/cli/src/command/deployments/delete.rs +++ b/cli/src/command/deployments/delete.rs @@ -1,5 +1,7 @@ use anyhow::Result; use clap::Args; +use dialoguer::theme::ColorfulTheme; +use dialoguer::Confirm; use slot::graphql::deployments::{delete_deployment::*, DeleteDeployment}; use slot::graphql::{GraphQLQuery, Response}; use slot::{api::Client, credential::Credentials}; @@ -19,10 +21,30 @@ pub struct DeleteArgs { #[arg(help = "The name of the service.")] pub service: Service, + + #[arg(help = "Force delete without confirmation", short('f'))] + pub force: bool, } impl DeleteArgs { pub async fn run(&self) -> Result<()> { + if !self.force { + let confirmation = Confirm::with_theme(&ColorfulTheme::default()) + .with_prompt(format!( + "Please confirm to delete {} {:?}", + &self.project, &self.service + )) + .default(false) + .show_default(true) + .wait_for_newline(true) + .interact() + .unwrap(); + + if !confirmation { + return Ok(()); + } + } + let service = match &self.service { Service::Katana => DeploymentService::katana, Service::Torii => DeploymentService::torii,