From 0c242a9eafca865be7ba7a9983b5331b7d28155f Mon Sep 17 00:00:00 2001 From: Syed Ahkam Date: Fri, 11 Aug 2023 01:04:51 +0530 Subject: [PATCH] feat: impl build command --- Cargo.lock | 18 ++++++++++++++++++ Cargo.toml | 3 ++- src/commands/build.rs | 37 +++++++++++++++++++++++++++++++++++++ src/commands/mod.rs | 1 + src/main.rs | 2 ++ src/utils.rs | 14 ++++++++++++++ 6 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 src/commands/build.rs diff --git a/Cargo.lock b/Cargo.lock index bf899b0..e1bafa8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -51,6 +51,7 @@ dependencies = [ "dialoguer", "env_logger", "guidon", + "which", ] [[package]] @@ -326,6 +327,12 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + [[package]] name = "encode_unicode" version = "0.3.6" @@ -1135,6 +1142,17 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "which" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +dependencies = [ + "either", + "libc", + "once_cell", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index d64a101..88176c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,4 +17,5 @@ path = "src/main.rs" clap = { version = "3.2.23", features = ["default", "derive"] } guidon = "0.4.1" env_logger = "0.10.0" -dialoguer = "0.10.4" \ No newline at end of file +dialoguer = "0.10.4" +which = "4.4.0" diff --git a/src/commands/build.rs b/src/commands/build.rs new file mode 100644 index 0000000..24feab5 --- /dev/null +++ b/src/commands/build.rs @@ -0,0 +1,37 @@ +use std::process::Command; + +use clap::{ + Parser, + ArgAction +}; + +use crate::utils::find_gradle; + +#[derive(Parser, Debug)] +pub struct Build { + /// Should build in release mode + #[clap(short, long, default_value="false", action = ArgAction::SetTrue)] + release: bool +} + +pub fn handle(args: Build) { + let gradle_path = find_gradle().expect("ERROR: Gradle not found on system"); + + // Decide gradle subcommand to use + let cmd = match args.release { + true => "assembleRelease", + false => "assembleDebug" + }; + + // Invoke gradle as child process + println!("Invoking Gradle: {}", gradle_path); + let status = Command::new(gradle_path) + .arg(cmd) + .status() + .unwrap(); + + match status.success() { + true => println!("Success!"), + false => println!("Failed while executing Gradle.") + } +} diff --git a/src/commands/mod.rs b/src/commands/mod.rs index c5fb369..7eb33f3 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -1 +1,2 @@ pub mod create; +pub mod build; diff --git a/src/main.rs b/src/main.rs index bb23edb..2175652 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,7 @@ struct Cli { #[derive(Subcommand, Debug)] enum SubCommand { Create(commands::create::Create), + Build(commands::build::Build) } fn main() { @@ -26,5 +27,6 @@ fn main() { match args.command { SubCommand::Create(args) => commands::create::handle(args), + SubCommand::Build(args) => commands::build::handle(args) } } diff --git a/src/utils.rs b/src/utils.rs index 6c0953b..3c7f39e 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,6 +1,20 @@ +use which::which; + pub fn prompt_for_input(prompt: &str) -> String { dialoguer::Input::::with_theme(&dialoguer::theme::ColorfulTheme::default()) .with_prompt(prompt) .interact_text() .unwrap() } + +pub fn find_gradle() -> Option { + if std::path::Path::new("./gradlew").exists() { + return Some("./gradlew".to_owned()); + } + + if which("gradle").is_ok() { + return Some("gradle".to_owned()); + } + + None +}