From 681066fde8406adec9d217b97c5ebb7de31d439c Mon Sep 17 00:00:00 2001 From: Todd Martin Date: Fri, 18 Mar 2022 15:49:41 -0700 Subject: [PATCH 1/3] Wrap function returns of Vec with options --- src/actions/package/install.rs | 8 +++--- src/actions/package/providers/aptitude.rs | 28 ++++++++++----------- src/actions/package/providers/bsdpkg.rs | 20 +++++++-------- src/actions/package/providers/homebrew.rs | 30 +++++++++++------------ src/actions/package/providers/mod.rs | 8 +++--- src/actions/package/providers/pkgin.rs | 20 ++++++++------- src/actions/package/providers/winget.rs | 20 ++++++++------- src/actions/package/providers/yay.rs | 29 +++++++++++----------- 8 files changed, 84 insertions(+), 79 deletions(-) diff --git a/src/actions/package/install.rs b/src/actions/package/install.rs index 369c5074..64ca075a 100644 --- a/src/actions/package/install.rs +++ b/src/actions/package/install.rs @@ -26,7 +26,7 @@ impl Action for PackageInstall { // If the provider isn't available, see if we can bootstrap it if !provider.available() { - if provider.bootstrap().is_empty() { + if provider.bootstrap().unwrap().is_empty() { error!( "Package Provider, {}, isn't available. Skipping action", provider.name() @@ -34,16 +34,16 @@ impl Action for PackageInstall { return vec![]; } - atoms.append(&mut provider.bootstrap()); + atoms.append(&mut provider.bootstrap().unwrap()); } if let Some(ref _repo) = variant.repository { if !provider.has_repository(&variant) { - atoms.append(&mut provider.add_repository(&variant)); + atoms.append(&mut provider.add_repository(&variant).unwrap()); } } - atoms.append(&mut provider.install(&variant)); + atoms.append(&mut provider.install(&variant).unwrap()); span.exit(); diff --git a/src/actions/package/providers/aptitude.rs b/src/actions/package/providers/aptitude.rs index d88e3f49..58569ea7 100644 --- a/src/actions/package/providers/aptitude.rs +++ b/src/actions/package/providers/aptitude.rs @@ -33,8 +33,8 @@ impl PackageProvider for Aptitude { } } - fn bootstrap(&self) -> Vec { - vec![Step { + fn bootstrap(&self) -> Option> { + Some(vec![Step { atom: Box::new(Exec { command: String::from("apt"), arguments: vec![ @@ -50,16 +50,16 @@ impl PackageProvider for Aptitude { }), initializers: vec![], finalizers: vec![], - }] + }]) } fn has_repository(&self, _package: &PackageVariant) -> bool { false } - fn add_repository(&self, package: &PackageVariant) -> Vec { + fn add_repository(&self, package: &PackageVariant) -> Option> { if package.repository.is_none() { - return vec![]; + return None; } let mut steps: Vec = vec![]; @@ -106,15 +106,15 @@ impl PackageProvider for Aptitude { }, ]); - steps + Some(steps) } - fn query(&self, package: &PackageVariant) -> Vec { - package.packages() + fn query(&self, package: &PackageVariant) -> Option> { + Some(package.packages()) } - fn install(&self, package: &PackageVariant) -> Vec { - vec![Step { + fn install(&self, package: &PackageVariant) -> Option> { + Some(vec![Step { atom: Box::new(Exec { command: String::from("apt"), arguments: vec![String::from("install"), String::from("--yes")] @@ -128,7 +128,7 @@ impl PackageProvider for Aptitude { }), initializers: vec![], finalizers: vec![], - }] + }]) } } @@ -150,7 +150,7 @@ mod test { let aptitude = Aptitude {}; let steps = aptitude.add_repository(&package); - assert_eq!(steps.len(), 0); + assert_eq!(steps.unwrap().len(), 0); } #[test] @@ -164,7 +164,7 @@ mod test { let aptitude = Aptitude {}; let steps = aptitude.add_repository(&package); - assert_eq!(steps.len(), 2); + assert_eq!(steps.unwrap().len(), 2); } #[test] @@ -179,6 +179,6 @@ mod test { let aptitude = Aptitude {}; let steps = aptitude.add_repository(&package); - assert_eq!(steps.len(), 3); + assert_eq!(steps.unwrap().len(), 3); } } diff --git a/src/actions/package/providers/bsdpkg.rs b/src/actions/package/providers/bsdpkg.rs index 8cf1ac7d..4724bbbc 100644 --- a/src/actions/package/providers/bsdpkg.rs +++ b/src/actions/package/providers/bsdpkg.rs @@ -32,8 +32,8 @@ impl PackageProvider for BsdPkg { } #[instrument(name = "bootstrap", level = "info", skip(self))] - fn bootstrap(&self) -> Vec { - vec![Step { + fn bootstrap(&self) -> Option> { + Some(vec![Step { atom: Box::new(Exec { command: String::from("/usr/sbin/pkg"), arguments: vec![String::from("bootstrap")], @@ -43,25 +43,25 @@ impl PackageProvider for BsdPkg { }), initializers: vec![], finalizers: vec![], - }] + }]) } fn has_repository(&self, _package: &PackageVariant) -> bool { false } - fn add_repository(&self, _package: &PackageVariant) -> Vec { - vec![] + fn add_repository(&self, _package: &PackageVariant) -> Option> { + None } - fn query(&self, package: &PackageVariant) -> Vec { + fn query(&self, package: &PackageVariant) -> Option> { // Install all packages for now, don't get smart about which // already are - package.packages() + Some(package.packages()) } - fn install(&self, package: &PackageVariant) -> Vec { - vec![ + fn install(&self, package: &PackageVariant) -> Option> { + Some(vec![ Step { atom: Box::new(Exec { command: String::from("/usr/sbin/pkg"), @@ -90,6 +90,6 @@ impl PackageProvider for BsdPkg { initializers: vec![], finalizers: vec![], }, - ] + ]) } } diff --git a/src/actions/package/providers/homebrew.rs b/src/actions/package/providers/homebrew.rs index d1bc5ed4..f9ba9919 100644 --- a/src/actions/package/providers/homebrew.rs +++ b/src/actions/package/providers/homebrew.rs @@ -18,15 +18,15 @@ impl PackageProvider for Homebrew { which("brew").is_ok() } - fn bootstrap(&self) -> Vec { - vec![Step { atom: Box::new(Exec { + fn bootstrap(&self) -> Option> { + Some(vec![Step { atom: Box::new(Exec { command: String::from("bash"), arguments: vec![ String::from("-c"), String::from("$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)") ], ..Default::default() - }), initializers: vec![], finalizers: vec![] },] + }), initializers: vec![], finalizers: vec![] },]) } fn has_repository(&self, _: &PackageVariant) -> bool { @@ -36,10 +36,10 @@ impl PackageProvider for Homebrew { false } - fn add_repository(&self, package: &PackageVariant) -> Vec { + fn add_repository(&self, package: &PackageVariant) -> Option> { let repository = package.repository.clone().unwrap(); - vec![Step { + Some(vec![Step { atom: Box::new(Exec { command: String::from("brew"), arguments: vec![String::from("tap"), repository], @@ -47,10 +47,10 @@ impl PackageProvider for Homebrew { }), initializers: vec![], finalizers: vec![], - }] + }]) } - fn query(&self, package: &PackageVariant) -> Vec { + fn query(&self, package: &PackageVariant) -> Option> { let prefix = String::from_utf8( Command::new("brew") .arg("--prefix") @@ -65,7 +65,7 @@ impl PackageProvider for Homebrew { let cellar = Path::new(&prefix).join("Cellar"); let caskroom = Path::new(&prefix).join("Caskroom"); - package + Some(package .packages() .into_iter() .filter(|p| { @@ -84,29 +84,29 @@ impl PackageProvider for Homebrew { Some(repository) => format!("{}/{}", repository, p), None => p, }) - .collect() + .collect()) } - fn install(&self, package: &PackageVariant) -> Vec { + fn install(&self, package: &PackageVariant) -> Option> { let need_installed = self.query(package); - if need_installed.is_empty() { - return vec![]; + if need_installed.unwrap().is_empty() { + return None; } - vec![Step { + Some(vec![Step { atom: Box::new(Exec { command: String::from("brew"), arguments: [ vec![String::from("install")], package.extra_args.clone(), - need_installed, + need_installed.unwrap(), ] .concat(), ..Default::default() }), initializers: vec![], finalizers: vec![], - }] + }]) } } diff --git a/src/actions/package/providers/mod.rs b/src/actions/package/providers/mod.rs index 1874ad47..bbea31a0 100644 --- a/src/actions/package/providers/mod.rs +++ b/src/actions/package/providers/mod.rs @@ -80,9 +80,9 @@ impl Default for PackageProviders { pub trait PackageProvider { fn name(&self) -> &str; fn available(&self) -> bool; - fn bootstrap(&self) -> Vec; + fn bootstrap(&self) -> Option>; fn has_repository(&self, package: &PackageVariant) -> bool; - fn add_repository(&self, package: &PackageVariant) -> Vec; - fn query(&self, package: &PackageVariant) -> Vec; - fn install(&self, package: &PackageVariant) -> Vec; + fn add_repository(&self, package: &PackageVariant) -> Option>; + fn query(&self, package: &PackageVariant) -> Option>; + fn install(&self, package: &PackageVariant) -> Option>; } diff --git a/src/actions/package/providers/pkgin.rs b/src/actions/package/providers/pkgin.rs index 077a4ffe..57b10560 100644 --- a/src/actions/package/providers/pkgin.rs +++ b/src/actions/package/providers/pkgin.rs @@ -27,28 +27,30 @@ impl PackageProvider for Pkgin { } #[instrument(name = "bootstrap", level = "info", skip(self))] - fn bootstrap(&self) -> Vec { + fn bootstrap(&self) -> Option> { // TODO: Adjust for boot strapping pkgin - vec![] + // vec![] + None } fn has_repository(&self, _package: &PackageVariant) -> bool { false } - fn add_repository(&self, _package: &PackageVariant) -> Vec { - vec![] + fn add_repository(&self, _package: &PackageVariant) -> Option> { + // vec![] + None } // TODO: Handle query pkgs with pkgin search - fn query(&self, package: &PackageVariant) -> Vec { + fn query(&self, package: &PackageVariant) -> Option> { // Install all packages for now, don't get smart about which // already are - package.packages() + Some(package.packages()) } - fn install(&self, package: &PackageVariant) -> Vec { - vec![ + fn install(&self, package: &PackageVariant) -> Option> { + Some(vec![ Step { atom: Box::new(Exec { command: String::from("/usr/pkg/bin/pkgin"), @@ -77,6 +79,6 @@ impl PackageProvider for Pkgin { initializers: vec![], finalizers: vec![], }, - ] + ]) } } diff --git a/src/actions/package/providers/winget.rs b/src/actions/package/providers/winget.rs index 662be97e..6750f5f9 100644 --- a/src/actions/package/providers/winget.rs +++ b/src/actions/package/providers/winget.rs @@ -23,25 +23,27 @@ impl PackageProvider for Winget { } } - fn bootstrap(&self) -> Vec { - vec![] + fn bootstrap(&self) -> Option> { + // vec![] + None } fn has_repository(&self, _package: &PackageVariant) -> bool { true } - fn add_repository(&self, _package: &PackageVariant) -> Vec { - vec![] + fn add_repository(&self, _package: &PackageVariant) -> Option> { + // vec![] + None } - fn query(&self, package: &PackageVariant) -> Vec { + fn query(&self, package: &PackageVariant) -> Option> { // Install all packages, make this smarter soon - package.packages() + Some(package.packages()) } - fn install(&self, package: &PackageVariant) -> Vec { - package + fn install(&self, package: &PackageVariant) -> Option> { + Some(package .packages() .iter() .map::(|p| Step { @@ -58,6 +60,6 @@ impl PackageProvider for Winget { initializers: vec![], finalizers: vec![], }) - .collect() + .collect()) } } diff --git a/src/actions/package/providers/yay.rs b/src/actions/package/providers/yay.rs index 92e1f736..c5d77b0b 100644 --- a/src/actions/package/providers/yay.rs +++ b/src/actions/package/providers/yay.rs @@ -27,8 +27,8 @@ impl PackageProvider for Yay { } } - fn bootstrap(&self) -> Vec { - vec![ + fn bootstrap(&self) -> Option> { + Some(vec![ Step { atom: Box::new(Exec { command: String::from("pacman"), @@ -67,18 +67,19 @@ impl PackageProvider for Yay { initializers: vec![], finalizers: vec![], }, - ] + ]) } fn has_repository(&self, _package: &PackageVariant) -> bool { false } - fn add_repository(&self, _package: &PackageVariant) -> Vec { - vec![] + fn add_repository(&self, _package: &PackageVariant) -> Option> { + // vec![] + None } - fn query(&self, package: &PackageVariant) -> Vec { + fn query(&self, package: &PackageVariant) -> Option> { let requested_already_installed: HashSet = String::from_utf8( Command::new("yay") .args( @@ -99,7 +100,7 @@ impl PackageProvider for Yay { "all requested installed packages: {:?}", requested_already_installed ); - package + Some(package .packages() .into_iter() .filter(|p| { @@ -111,15 +112,15 @@ impl PackageProvider for Yay { true } }) - .collect() + .collect()) } - fn install(&self, package: &PackageVariant) -> Vec { + fn install(&self, package: &PackageVariant) -> Option> { let need_installed = self.query(package); - if need_installed.is_empty() { - return vec![]; + if need_installed.unwrap().is_empty() { + return None; } - vec![Step { + Some(vec![Step { atom: Box::new(Exec { command: String::from("yay"), arguments: [ @@ -130,13 +131,13 @@ impl PackageProvider for Yay { String::from("--nodiffmenu"), ], package.extra_args.clone(), - need_installed, + need_installed.unwrap(), ] .concat(), ..Default::default() }), initializers: vec![], finalizers: vec![], - }] + }]) } } From 759520e8f475bf15b8bd0b5a260171e3e200d0c5 Mon Sep 17 00:00:00 2001 From: Todd Martin Date: Fri, 18 Mar 2022 16:08:50 -0700 Subject: [PATCH 2/3] Handle wrapped returns --- src/actions/package/providers/homebrew.rs | 15 ++++++++++----- src/actions/package/providers/yay.rs | 17 ++++++++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/actions/package/providers/homebrew.rs b/src/actions/package/providers/homebrew.rs index f9ba9919..7c9c6c44 100644 --- a/src/actions/package/providers/homebrew.rs +++ b/src/actions/package/providers/homebrew.rs @@ -88,11 +88,16 @@ impl PackageProvider for Homebrew { } fn install(&self, package: &PackageVariant) -> Option> { - let need_installed = self.query(package); + // let need_installed = self.query(package); - if need_installed.unwrap().is_empty() { - return None; - } + // if need_installed.unwrap().is_empty() { + // return None; + // } + + let need_installed: Vec = match self.query(package) { + Some(packages) => packages, + None => return None, + }; Some(vec![Step { atom: Box::new(Exec { @@ -100,7 +105,7 @@ impl PackageProvider for Homebrew { arguments: [ vec![String::from("install")], package.extra_args.clone(), - need_installed.unwrap(), + need_installed, ] .concat(), ..Default::default() diff --git a/src/actions/package/providers/yay.rs b/src/actions/package/providers/yay.rs index c5d77b0b..3fa5f65f 100644 --- a/src/actions/package/providers/yay.rs +++ b/src/actions/package/providers/yay.rs @@ -116,10 +116,17 @@ impl PackageProvider for Yay { } fn install(&self, package: &PackageVariant) -> Option> { - let need_installed = self.query(package); - if need_installed.unwrap().is_empty() { - return None; - } + // let need_installed = self.query(package); + + //if need_installed.unwrap().is_empty() { + // return None; + //} + + let need_installed = match self.query(package) { + Some(packages) => packages, + None => return None, + }; + Some(vec![Step { atom: Box::new(Exec { command: String::from("yay"), @@ -131,7 +138,7 @@ impl PackageProvider for Yay { String::from("--nodiffmenu"), ], package.extra_args.clone(), - need_installed.unwrap(), + need_installed, ] .concat(), ..Default::default() From 6b616288e02796186d01657ff1b61aa055b5594a Mon Sep 17 00:00:00 2001 From: Todd Martin Date: Fri, 18 Mar 2022 16:17:46 -0700 Subject: [PATCH 3/3] Fix formatting --- src/actions/package/providers/homebrew.rs | 44 ++++++++++++----------- src/actions/package/providers/winget.rs | 38 ++++++++++---------- src/actions/package/providers/yay.rs | 32 +++++++++-------- 3 files changed, 60 insertions(+), 54 deletions(-) diff --git a/src/actions/package/providers/homebrew.rs b/src/actions/package/providers/homebrew.rs index 7c9c6c44..8ea76c04 100644 --- a/src/actions/package/providers/homebrew.rs +++ b/src/actions/package/providers/homebrew.rs @@ -65,33 +65,35 @@ impl PackageProvider for Homebrew { let cellar = Path::new(&prefix).join("Cellar"); let caskroom = Path::new(&prefix).join("Caskroom"); - Some(package - .packages() - .into_iter() - .filter(|p| { - if cellar.join(&p).is_dir() { - trace!("{}: found in Cellar", p); - false - } else if caskroom.join(&p).is_dir() { - trace!("{}: found in Caskroom", p); - false - } else { - debug!("{}: doesn't appear to be installed", p); - true - } - }) - .map(|p| match &package.repository { - Some(repository) => format!("{}/{}", repository, p), - None => p, - }) - .collect()) + Some( + package + .packages() + .into_iter() + .filter(|p| { + if cellar.join(&p).is_dir() { + trace!("{}: found in Cellar", p); + false + } else if caskroom.join(&p).is_dir() { + trace!("{}: found in Caskroom", p); + false + } else { + debug!("{}: doesn't appear to be installed", p); + true + } + }) + .map(|p| match &package.repository { + Some(repository) => format!("{}/{}", repository, p), + None => p, + }) + .collect(), + ) } fn install(&self, package: &PackageVariant) -> Option> { // let need_installed = self.query(package); // if need_installed.unwrap().is_empty() { - // return None; + // return None; // } let need_installed: Vec = match self.query(package) { diff --git a/src/actions/package/providers/winget.rs b/src/actions/package/providers/winget.rs index 6750f5f9..ae926514 100644 --- a/src/actions/package/providers/winget.rs +++ b/src/actions/package/providers/winget.rs @@ -43,23 +43,25 @@ impl PackageProvider for Winget { } fn install(&self, package: &PackageVariant) -> Option> { - Some(package - .packages() - .iter() - .map::(|p| Step { - atom: Box::new(Exec { - command: String::from("winget"), - arguments: [ - vec![String::from("install"), String::from("--silent")], - package.extra_args.clone(), - vec![p.clone()], - ] - .concat(), - ..Default::default() - }), - initializers: vec![], - finalizers: vec![], - }) - .collect()) + Some( + package + .packages() + .iter() + .map::(|p| Step { + atom: Box::new(Exec { + command: String::from("winget"), + arguments: [ + vec![String::from("install"), String::from("--silent")], + package.extra_args.clone(), + vec![p.clone()], + ] + .concat(), + ..Default::default() + }), + initializers: vec![], + finalizers: vec![], + }) + .collect(), + ) } } diff --git a/src/actions/package/providers/yay.rs b/src/actions/package/providers/yay.rs index 3fa5f65f..88382c36 100644 --- a/src/actions/package/providers/yay.rs +++ b/src/actions/package/providers/yay.rs @@ -100,31 +100,33 @@ impl PackageProvider for Yay { "all requested installed packages: {:?}", requested_already_installed ); - Some(package - .packages() - .into_iter() - .filter(|p| { - if requested_already_installed.contains(p) { - trace!("{}: already installed", p); - false - } else { - debug!("{}: doesn't appear to be installed", p); - true - } - }) - .collect()) + Some( + package + .packages() + .into_iter() + .filter(|p| { + if requested_already_installed.contains(p) { + trace!("{}: already installed", p); + false + } else { + debug!("{}: doesn't appear to be installed", p); + true + } + }) + .collect(), + ) } fn install(&self, package: &PackageVariant) -> Option> { // let need_installed = self.query(package); //if need_installed.unwrap().is_empty() { - // return None; + // return None; //} let need_installed = match self.query(package) { Some(packages) => packages, - None => return None, + None => return None, }; Some(vec![Step {