use crate::port_forwarding::cmd::add_cmd;
use crate::port_forwarding::ipv::Ipv;
use crate::utils::{check_ipv4_by_string, run_multiple_commands};
use serde::{Deserialize, Serialize};
use std::cmp::{Eq, PartialEq};
use std::fmt;
use std::fmt::{Debug, Display, Formatter};
use std::hash::{Hash, Hasher};
pub mod cmd;
pub mod command;
pub mod ipv;
pub mod backups;
#[derive(Serialize, Deserialize, Debug)]
pub struct PortForwarding {
pub listen: Ipv, pub connect: Ipv, }
impl PortForwarding {
pub fn get_ipv4_to_ipv4() -> Vec<PortForwarding> {
command::get_all_ipv4_to_ipv4_port_proxy()
}
pub fn reset() {
command::reset()
}
pub fn set(po: &PortForwarding) {
command::set(po)
}
pub fn new<S: AsRef<str>>(listen_from: (S, i64), connect_to: (S, i64)) -> Self {
let listen = Ipv::new(listen_from.0, listen_from.1);
let connect = Ipv::new(connect_to.0, connect_to.1);
PortForwarding { listen, connect }
}
pub fn new_multiple(list: Vec<PortForwarding>) {
let vs = list
.into_iter()
.filter(PortForwarding::check_ipv_address) .collect::<Vec<PortForwarding>>()
.into_iter()
.map(|x| add_cmd(&x)) .collect::<Vec<String>>();
run_multiple_commands(&vs, false, true);
}
pub fn forward(&self) {
command::add(self);
}
pub fn del(&self) {
let listen = &self.listen;
command::del(&listen.address, &listen.port);
}
pub fn check(&self) -> bool {
let items = command::get_all_ipv4_to_ipv4_port_proxy();
for item in items {
if item == *self {
return true;
}
}
false
}
pub fn check_ipv_address(&self) -> bool {
check_ipv4_by_string(&self.listen.address) && check_ipv4_by_string(&self.connect.address)
}
}
impl Display for PortForwarding {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
let listen = &self.listen;
let connect = &self.connect;
write!(
f,
"PortForwarding(from {}:{},to {}:{})",
listen.address, listen.port, connect.address, connect.port
)
}
}
impl PartialEq for PortForwarding {
fn eq(&self, other: &Self) -> bool {
self.listen.address == other.listen.address
&& self.listen.port == other.listen.port
&& self.connect.address == other.connect.address
&& self.connect.port == other.connect.port
}
}
impl Eq for PortForwarding {}
impl Hash for PortForwarding {
fn hash<H: Hasher>(&self, state: &mut H) {
self.listen.address.hash(state);
self.listen.port.hash(state);
self.connect.address.hash(state);
self.connect.port.hash(state);
}
}