use crate::commands::{self, Command};
use crate::env::Environment;
use crate::error::Error;
use crate::image::ImageStore;
use crate::instance::{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 Command for HostfwdCommands {
fn run(
&self,
console: &mut dyn Console,
env: &Environment,
image_store: &dyn ImageStore,
instance_store: &dyn InstanceStore,
) -> Result<(), Error> {
match self {
HostfwdCommands::List(cmd) => cmd.run(console, env, image_store, instance_store),
HostfwdCommands::Add { instance, rule } => match PortForward::from_qemu(rule) {
Ok(rule) => {
let mut instance = instance_store.load(instance)?;
instance.hostfwd.push(rule);
instance_store.store(&instance)
}
Err(msg) => Err(Error::HostFwdRuleMalformed(msg)),
},
HostfwdCommands::Del { instance, rule } => match PortForward::from_qemu(rule) {
Ok(rule) => {
let mut instance = instance_store.load(instance)?;
instance.hostfwd.retain(|item| item != &rule);
instance_store.store(&instance)
}
Err(msg) => Err(Error::HostFwdRuleMalformed(msg)),
},
}
}
}