diff --git a/Cargo.lock b/Cargo.lock index 07ce01c..fc5d7f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,113 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "anstream" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" + +[[package]] +name = "anstyle-parse" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "clap" +version = "4.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "colorchoice" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itoa" version = "1.0.11" @@ -63,6 +170,12 @@ dependencies = [ "serde", ] +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "syn" version = "2.0.69" @@ -80,10 +193,90 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "yu" version = "0.1.0" dependencies = [ + "clap", "serde", "serde_json", ] diff --git a/Cargo.toml b/Cargo.toml index 94d33e7..1fa5124 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" [dependencies] serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +clap = { version = "4.0", features = ["derive"] } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 9db156f..a6dfc4c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,36 +1,70 @@ +use clap::{Arg, Command}; use std::process::Stdio; mod env; mod syntax; fn main() { - let args: Vec = std::env::args().collect(); + let matches = Command::new("yu") + .version("0.1.0") + .about("A simple package manager wrapper") + .arg( + Arg::new("command") + .help("The command to execute") + .required(false) + .index(1), + ) + .arg( + Arg::new("package") + .help("The package to install or uninstall") + .required(false) + .index(2), + ) + .arg( + Arg::new("silent") + .long("silent") + .help("Run the command silently") + .action(clap::ArgAction::SetTrue), + ) + .arg( + Arg::new("verbose") + .long("verbose") + .help("Run the command with verbose output") + .action(clap::ArgAction::SetTrue), + ) + .get_matches(); + let package_manager = env::detect_package_manager(); - if args.len() < 2 { - upgrade(package_manager.clone()); - return; - } - match args[1].as_str() { - "install" => install(package_manager.clone(), args[2].clone()), - "uninstall" => uninstall(package_manager.clone(), args[2].clone()), - "upgrade" => upgrade(package_manager.clone()), + // 檢查是否提供命令,若無則默認為 "upgrade" + let command = matches.get_one::("command").map(|s| s.as_str()).unwrap_or("upgrade"); + let package = matches.get_one::("package").unwrap_or(&"".to_string()).to_string(); + let silent = *matches.get_one::("silent").unwrap_or(&false); + let verbose = *matches.get_one::("verbose").unwrap_or(&false); + + match command { + "install" => install(package_manager.clone(), package, silent, verbose), + "uninstall" => uninstall(package_manager.clone(), package, silent, verbose), + "upgrade" => upgrade(package_manager.clone(), silent, verbose), _ => { - println!("Unknown command: {}", args[1]); + println!("Unknown command: {}", command); } } } -fn install(manager: String, package: String) { +fn install(manager: String, package: String, silent: bool, verbose: bool) { if package.is_empty() { println!("Usage: install "); return; } - println!("yu: Installing package: {}", package); + if !silent { + println!("yu: Installing package: {}", package); + } + let mut cmd = syntax::gen_install_syntax(manager.clone()) .arg(package) - .stdout(Stdio::inherit()) + .stdout(if verbose { Stdio::inherit() } else { Stdio::null() }) .stderr(Stdio::inherit()) .spawn() .expect("yu: Failed to execute command"); @@ -38,16 +72,19 @@ fn install(manager: String, package: String) { cmd.wait().expect("Command wasn't running"); } -fn uninstall(manager: String, package: String) { +fn uninstall(manager: String, package: String, silent: bool, verbose: bool) { if package.is_empty() { println!("Usage: uninstall "); return; } - println!("yu: Uninstalling package: {}", package); + if !silent { + println!("yu: Uninstalling package: {}", package); + } + let mut cmd = syntax::gen_uninstall_syntax(manager.clone()) .arg(package) - .stdout(Stdio::inherit()) + .stdout(if verbose { Stdio::inherit() } else { Stdio::null() }) .stderr(Stdio::inherit()) .spawn() .expect("yu: Failed to execute command"); @@ -55,24 +92,30 @@ fn uninstall(manager: String, package: String) { cmd.wait().expect("Command wasn't running"); } -fn upgrade(manager: String) { - println!("yu: Updating system"); +fn upgrade(manager: String, silent: bool, verbose: bool) { + if !silent { + println!("yu: Updating system"); + } let mut update_cmd = syntax::gen_update_syntax(manager.clone()) - .stdout(Stdio::inherit()) + .stdout(if verbose { Stdio::inherit() } else { Stdio::null() }) .stderr(Stdio::inherit()) .spawn() .expect("Failed to execute update command"); update_cmd.wait().expect("Update command wasn't running"); - println!("yu: Upgrading system"); + if !silent { + println!("yu: Upgrading system"); + } let mut upgrade_cmd = syntax::gen_upgrade_syntax(manager.clone()) - .stdout(Stdio::inherit()) + .stdout(if verbose { Stdio::inherit() } else { Stdio::null() }) .stderr(Stdio::inherit()) .spawn() .expect("Failed to execute upgrade command"); upgrade_cmd.wait().expect("Upgrade command wasn't running"); - println!("yu: System upgraded"); + if !silent { + println!("yu: System upgraded"); + } }