1use crate::apt::Apt;
4use crate::brew::Brew;
5use crate::dnf::Dnf;
6use crate::manager::PackageManager;
7use crate::pacman::Pacman;
8use crate::scoop::Scoop;
9use crate::winget::Winget;
10
11pub fn detect_all() -> Vec<Box<dyn PackageManager>> {
19 let candidates: Vec<Box<dyn PackageManager>> = if cfg!(target_os = "macos") {
20 vec![Box::new(Brew)]
21 } else if cfg!(target_os = "windows") {
22 vec![Box::new(Scoop), Box::new(Winget)]
23 } else {
24 vec![Box::new(Pacman), Box::new(Dnf), Box::new(Apt)]
25 };
26 candidates
27 .into_iter()
28 .filter(|m| m.is_available())
29 .collect()
30}
31
32pub fn pick_default() -> Option<Box<dyn PackageManager>> {
34 detect_all().into_iter().next()
35}
36
37pub fn pick_by_name(name: &str) -> Option<Box<dyn PackageManager>> {
41 let all: Vec<Box<dyn PackageManager>> = vec![
42 Box::new(Pacman),
43 Box::new(Apt),
44 Box::new(Dnf),
45 Box::new(Brew),
46 Box::new(Scoop),
47 Box::new(Winget),
48 ];
49 all.into_iter().find(|m| m.name() == name)
50}