use std::collections::HashMap;
macro_rules! string_vec {
($($item:expr),+ $(,)?) => {{
vec![
$( String::from($item), )*
]
}};
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum CommandType {
InstallPackage,
UpdateIndex,
}
#[derive(Clone, Debug)]
pub enum PromptArgument {
None,
Interactive(String),
Skip(String),
}
#[derive(Clone, Debug)]
pub enum VersionArgument {
None,
Inline(String),
Separate(String),
}
#[derive(Clone, Debug)]
pub struct PackageManagerConfig {
pub commands: HashMap<CommandType, Vec<String>>,
pub prompt_arg: PromptArgument,
pub prompt_for: Vec<CommandType>,
pub version_arg: VersionArgument,
}
pub(crate) fn apk() -> PackageManagerConfig {
PackageManagerConfig {
commands: HashMap::from_iter([
(CommandType::InstallPackage, string_vec!["apk", "add", "$"]),
(CommandType::UpdateIndex, string_vec!["apk", "update"]),
]),
prompt_arg: PromptArgument::Interactive("-i".into()),
prompt_for: vec![CommandType::InstallPackage, CommandType::UpdateIndex],
version_arg: VersionArgument::Inline("=".into()),
}
}
pub(crate) fn apt() -> PackageManagerConfig {
PackageManagerConfig {
commands: HashMap::from_iter([
(
CommandType::InstallPackage,
string_vec!["apt", "install", "--install-recommends", "$"],
),
(CommandType::UpdateIndex, string_vec!["apt", "update"]),
]),
prompt_arg: PromptArgument::Skip("-y".into()),
prompt_for: vec![CommandType::InstallPackage, CommandType::UpdateIndex],
version_arg: VersionArgument::Inline("=".into()),
}
}
pub(crate) fn brew() -> PackageManagerConfig {
PackageManagerConfig {
commands: HashMap::from_iter([
(
CommandType::InstallPackage,
string_vec!["brew", "install", "$"],
),
(CommandType::UpdateIndex, string_vec!["brew", "update"]),
]),
prompt_arg: PromptArgument::Interactive("-i".into()),
prompt_for: vec![CommandType::InstallPackage],
version_arg: VersionArgument::Inline("@".into()),
}
}
pub(crate) fn choco() -> PackageManagerConfig {
PackageManagerConfig {
commands: HashMap::from_iter([(
CommandType::InstallPackage,
string_vec!["choco", "install", "$"],
)]),
prompt_arg: PromptArgument::Skip("-y".into()),
prompt_for: vec![CommandType::InstallPackage],
version_arg: VersionArgument::Separate("--version".into()),
}
}
pub(crate) fn dnf() -> PackageManagerConfig {
PackageManagerConfig {
commands: HashMap::from_iter([
(
CommandType::InstallPackage,
string_vec!["dnf", "install", "$"],
),
(CommandType::UpdateIndex, string_vec!["dnf", "check-update"]),
]),
prompt_arg: PromptArgument::Skip("-y".into()),
prompt_for: vec![CommandType::InstallPackage, CommandType::UpdateIndex],
version_arg: VersionArgument::Inline("-".into()),
}
}
pub(crate) fn pacman() -> PackageManagerConfig {
PackageManagerConfig {
commands: HashMap::from_iter([
(
CommandType::InstallPackage,
string_vec!["pacman", "-S", "$"],
),
(CommandType::UpdateIndex, string_vec!["pacman", "-Syy"]),
]),
prompt_arg: PromptArgument::Skip("--noconfirm".into()),
prompt_for: vec![CommandType::InstallPackage],
version_arg: VersionArgument::Inline(">=".into()),
}
}
pub(crate) fn pkg() -> PackageManagerConfig {
PackageManagerConfig {
commands: HashMap::from_iter([
(
CommandType::InstallPackage,
string_vec!["pkg", "install", "$"],
),
(CommandType::UpdateIndex, string_vec!["pkg", "update"]),
]),
prompt_arg: PromptArgument::Skip("-y".into()),
prompt_for: vec![CommandType::InstallPackage],
version_arg: VersionArgument::None,
}
}
pub(crate) fn pkgin() -> PackageManagerConfig {
PackageManagerConfig {
commands: HashMap::from_iter([
(
CommandType::InstallPackage,
string_vec!["pkgin", "install", "$"],
),
(CommandType::UpdateIndex, string_vec!["pkgin", "update"]),
]),
prompt_arg: PromptArgument::Skip("-y".into()),
prompt_for: vec![CommandType::InstallPackage, CommandType::UpdateIndex],
version_arg: VersionArgument::Inline("-".into()),
}
}
pub(crate) fn scoop() -> PackageManagerConfig {
PackageManagerConfig {
commands: HashMap::from_iter([
(
CommandType::InstallPackage,
string_vec!["scoop", "install", "$"],
),
(CommandType::UpdateIndex, string_vec!["scoop", "update"]),
]),
prompt_arg: PromptArgument::None,
prompt_for: vec![],
version_arg: VersionArgument::Inline("@".into()),
}
}
pub(crate) fn yum() -> PackageManagerConfig {
PackageManagerConfig {
commands: HashMap::from_iter([
(
CommandType::InstallPackage,
string_vec!["yum", "install", "$"],
),
(CommandType::UpdateIndex, string_vec!["yum", "check-update"]),
]),
prompt_arg: PromptArgument::Skip("-y".into()),
prompt_for: vec![CommandType::InstallPackage],
version_arg: VersionArgument::Inline("-".into()),
}
}