use crate::commands;
use crate::error::Error;
use crate::instance::{InstanceDao, InstanceStore, PortForward};
use crate::view::Console;
use clap::Subcommand;
#[derive(Subcommand)]
pub enum HostfwdCommands {
#[clap(verbatim_doc_comment, alias = "ls")]
List(commands::ListPortCommand),
#[clap(verbatim_doc_comment)]
Add {
instance: String,
rule: String,
},
#[clap(verbatim_doc_comment, alias = "rm")]
Del {
instance: String,
rule: String,
},
}
impl HostfwdCommands {
pub fn dispatch(
&self,
console: &mut dyn Console,
instance_dao: &InstanceDao,
) -> Result<(), Error> {
match self {
HostfwdCommands::List(cmd) => cmd.run(console, instance_dao),
HostfwdCommands::Add { instance, rule } => match PortForward::from_qemu(rule) {
Ok(rule) => {
let mut instance = instance_dao.load(instance)?;
instance.hostfwd.push(rule);
instance_dao.store(&instance)
}
Err(msg) => Err(Error::HostFwdRuleMalformed(msg)),
},
HostfwdCommands::Del { instance, rule } => match PortForward::from_qemu(rule) {
Ok(rule) => {
let mut instance = instance_dao.load(instance)?;
instance.hostfwd.retain(|item| item != &rule);
instance_dao.store(&instance)
}
Err(msg) => Err(Error::HostFwdRuleMalformed(msg)),
},
}
}
}