diff --git a/Cargo.lock b/Cargo.lock index ec464f9..4686b48 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -111,6 +111,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "expect-exit" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51a35d7c9abd6c97c27ac44c4295fec4f51ffd2dcbf6fd45fc1cd39d11ad9df" + [[package]] name = "hashbrown" version = "0.14.1" @@ -141,9 +147,10 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "manplan" -version = "0.1.3" +version = "0.1.4" dependencies = [ "clap", + "expect-exit", "maplit", "regex", "serde", diff --git a/Cargo.toml b/Cargo.toml index e350572..98c239d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "manplan" -version = "0.1.3" +version = "0.1.4" authors = ["Gerard Krupa"] edition = "2021" description = "Tool for keeping sdkman candidates up-to-date" @@ -17,6 +17,7 @@ serde = { version = "1.0", features = ["derive"] } serde_yaml = "0.9" maplit = "1.0.2" clap = { version = "4.4.6", features = ["derive"] } +expect-exit = "0.5.2" [profile.release] lto = "fat" diff --git a/src/main.rs b/src/main.rs index 3bff5c0..aea8759 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,9 @@ use std::collections::HashSet; -use std::fs; +use std::path::Path; +use std::{env, fs}; use clap::Parser; +use expect_exit::Expected; use crate::rules::{parse_rules, VersionMatch}; use crate::sdkman::{SdkMan, ToolManager}; @@ -14,7 +16,7 @@ pub mod sdkman; struct Args { /// Filename of the YAML config file #[arg(short, long)] - file: String, + file: Option, /// Just print out the commands that would be executed #[arg(short, long, default_value_t = false)] @@ -25,6 +27,19 @@ struct Args { no_uninstall: bool, } +#[allow(clippy::needless_return)] +fn get_rules_file(args: &Args) -> Option { + if let Some(file) = args.file.as_ref() { + return Some(file.clone()); + } else if let Ok(home) = env::var("HOME") { + let dotfile = Path::new(home.as_str()).join(".sdk-rules.yaml"); + if dotfile.is_file() { + return Some(dotfile.to_str().unwrap().to_string()); + } + } + return None; +} + fn main() { let args = Args::parse(); @@ -32,7 +47,11 @@ fn main() { dry_run: args.dry_run, no_uninstall: args.no_uninstall, }; - let rules = parse_rules(fs::read_to_string(args.file).expect("Failed to read input file")); + + let rules_file = + get_rules_file(&args).or_exit_("Must specify -f or have a ~/.sdk-rules.yaml file"); + let rules = parse_rules(fs::read_to_string(rules_file).or_exit_("Failed to read rules file")); + for (name, candidate) in rules.expect("Rules file could not be parsed").candidates { let installed: HashSet<_> = sdkman .installed_versions(name.clone())