1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/// This part of the crate is for interacting with the operating system's
/// local package manager when rapture fails to install a package.
/// It supports installing through apt, scoop, and brew.

use crate::platform::Platform;

/// Get the name of the expected package manager for the current platform
pub fn installer_name() -> String {
    match Platform::get() {
        Platform::Ubuntu => {
            "apt".to_string()
        },
        Platform::MacOS => {
            "brew".to_string()
        },
        Platform::Windows => {
            "scoop".to_string()
        },
        Platform::Unknown => {
            "apt".to_string()
        }
    }
}


/// Install a package using the systems expected package manager
pub fn install(name: String) -> Result<(), String> {
    match Platform::get() {
        Platform::Ubuntu => {
            apt_install(name)
        },
        Platform::MacOS => {
            brew_install(name)
        },
        Platform::Windows => {
            scoop_install(name)
        },
        Platform::Unknown => {
            apt_install(name)
        },
    }
}


/// Install a package with apt
fn apt_install(name: String) -> Result<(), String> {
    match Platform::command(format!("sudo apt install {}", name)) {
        Ok(_) => Ok(()),
        Err(_) => Err(format!("apt failed to install {}", name))
    }
}

/// Install a package with brew
fn brew_install(name: String) -> Result<(), String> {
    match Platform::command(format!("brew install {}", name)) {
        Ok(_) => Ok(()),
        Err(_) => Err(format!("brew failed to install {}", name))
    }
}

/// Install a package with scoop
fn scoop_install(name: String) -> Result<(), String> {
    match Platform::command(format!("scoop install {}", name)) {
        Ok(_) => Ok(()),
        Err(_) => Err(format!("scoop failed to install {}", name))
    }
}