please-install 1.2.0

A unified interface package manager for many OSes
Documentation
use crate::package::Package;
use crate::vendor_data::VendorData;
use crate::Vendor;

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PlsCommand {
    Install,
    ReinstallAll,
    Remove,
    Upgrade,
    Search,
    Info,
    Update,
    UpgradeAll,
    List,
    Move {
        origin: Vendor,
        destination: Vendor,
    },
    #[cfg(target_os = "linux")]
    Enable {
        user: bool,
        service: String,
    },
    #[cfg(target_os = "linux")]
    Disable {
        user: bool,
        service: String,
    },
    #[cfg(target_os = "linux")]
    Start {
        user: bool,
        service: String,
    },
    #[cfg(target_os = "linux")]
    Stop {
        user: bool,
        service: String,
    },
    #[cfg(target_os = "linux")]
    Restart {
        user: bool,
        service: String,
    },
    #[cfg(target_os = "linux")]
    Status {
        user: bool,
        service: String,
    },
    #[cfg(target_os = "linux")]
    Reload { user: bool },
}

impl PlsCommand {
    pub fn format(&self, vendor: VendorData, args: &Vec<Package>, yes: bool, pager: &Option<String>) -> String {
        let args = match self {
            PlsCommand::Remove |
            PlsCommand::Info => args.iter()
                .map(|arg| arg.name.clone())
                .collect::<Vec<String>>()
                .join(" "),

            _ => args.iter()
                .map(|arg| arg.to_string())
                .collect::<Vec<String>>()
                .join(" "),
        };

        match self {
            PlsCommand::Install => vendor.1[2].to_owned(),
            PlsCommand::ReinstallAll => vendor.1[4].to_owned(),
            PlsCommand::Remove => vendor.1[3].to_owned(),
            PlsCommand::Upgrade => vendor.1[4].to_owned(),
            PlsCommand::Info => if let Some(pager) = pager {
                format!("{} | {}", vendor.1[6], pager)
            } else {
                vendor.1[6].to_owned()
            },
            PlsCommand::Update => vendor.1[7].to_owned(),
            PlsCommand::UpgradeAll => vendor.1[8].to_owned(),
            PlsCommand::Move { origin, destination } =>
                format!("move from {} to {}", origin, destination),
            PlsCommand::Search => {
                if let Some(pager) = pager {
                    format!("{} | {}", vendor.1[5], pager)
                } else {
                    vendor.1[5].to_owned()
                }
            }
            PlsCommand::List => {
                if let Some(pager) = pager {
                    format!("{} | {}", vendor.1[9], pager)
                } else {
                    vendor.1[9].to_owned()
                }
            }
            #[cfg(target_os = "linux")]
            PlsCommand::Enable { user, service } => {
                if *user {
                    format!("systemctl --user enable {}", service)
                } else {
                    format!("systemctl enable {}", service)
                }
            }
            #[cfg(target_os = "linux")]
            PlsCommand::Disable { user, service } => {
                if *user {
                    format!("systemctl --user disable {}", service)
                } else {
                    format!("systemctl disable {}", service)
                }
            }
            #[cfg(target_os = "linux")]
            PlsCommand::Start { user, service } => {
                if *user {
                    format!("systemctl --user start {}", service)
                } else {
                    format!("systemctl start {}", service)
                }
            }
            #[cfg(target_os = "linux")]
            PlsCommand::Stop { user, service } => {
                if *user {
                    format!("systemctl --user stop {}", service)
                } else {
                    format!("systemctl stop {}", service)
                }
            }
            #[cfg(target_os = "linux")]
            PlsCommand::Restart { user, service } => {
                if *user {
                    format!("systemctl --user restart {}", service)
                } else {
                    format!("systemctl restart {}", service)
                }
            }
            #[cfg(target_os = "linux")]
            PlsCommand::Status { user, service } => {
                if *user {
                    format!("systemctl --user status {}", service)
                } else {
                    format!("systemctl status {}", service)
                }
            }
            #[cfg(target_os = "linux")]
            PlsCommand::Reload { user } => {
                if *user {
                    format!("systemctl --user daemon-reload")
                } else {
                    format!("systemctl daemon-reload")
                }
            }
        }
        .replace("$yes", if yes {vendor.1[1]} else {""})
        .replace("$args", &args)
    }

    pub fn support_pager(&self) -> bool {
        match self {
            PlsCommand::Info |
            PlsCommand::Move { .. } |
            PlsCommand::Search |
            PlsCommand::List => true,
            _ => false,
        }
    }
}