Files
2024-06-15 20:52:35 +08:00

86 lines
2.6 KiB
Rust

use anyhow::Context;
use std::net::SocketAddr;
use std::str::FromStr;
#[derive(Clone, Debug)]
pub struct VnLinkConfig {
pub mapping: Vec<LinkItem>,
}
impl VnLinkConfig {
pub fn new(mapping: Vec<LinkItem>) -> Self {
Self { mapping }
}
}
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub enum LinkProtocol {
Tcp,
Udp,
}
impl LinkProtocol {
pub fn is_tcp(&self) -> bool {
self == &LinkProtocol::Tcp
}
}
#[derive(Copy, Clone, Debug)]
pub struct LinkItem {
pub protocol: LinkProtocol,
pub src_port: u16,
pub dest: SocketAddr,
}
impl LinkItem {
pub fn new(protocol: LinkProtocol, src_port: u16, dest: SocketAddr) -> Self {
Self {
protocol,
src_port,
dest,
}
}
}
pub fn convert(vec: Vec<String>) -> anyhow::Result<Vec<LinkItem>> {
let mut rs = Vec::with_capacity(vec.len());
for x in vec {
let string = x.trim().to_lowercase();
if let Some(udp_mapping) = string.strip_prefix("udp:") {
let mut split = udp_mapping.split("-");
let bind_port = split
.next()
.with_context(|| format!("vnt-mapping error {:?},eg: udp:80-10.26.0.10:8080", x))?;
let bind_port = u16::from_str(bind_port)
.with_context(|| format!("udp_mapping error {}", bind_port))?;
let dest = split
.next()
.with_context(|| format!("vnt-mapping error {:?},eg: udp:80-10.26.0.10:8080", x))?;
let dest_addr = SocketAddr::from_str(dest)
.with_context(|| format!("udp_mapping error {}", dest))?;
rs.push(LinkItem::new(LinkProtocol::Udp, bind_port, dest_addr));
continue;
}
if let Some(tcp_mapping) = string.strip_prefix("tcp:") {
let mut split = tcp_mapping.split("-");
let bind_port = split
.next()
.with_context(|| format!("vnt-mapping error {:?},eg: tcp:80-10.26.0.10:8080", x))?;
let bind_port = u16::from_str(bind_port)
.with_context(|| format!("tcp_mapping error {}", bind_port))?;
let dest = split
.next()
.with_context(|| format!("vnt-mapping error {:?},eg: tcp:80-10.26.0.10:8080", x))?;
let dest_addr = SocketAddr::from_str(dest)
.with_context(|| format!("tcp_mapping error {}", dest))?;
rs.push(LinkItem::new(LinkProtocol::Tcp, bind_port, dest_addr));
continue;
}
Err(anyhow::anyhow!(
"vnt-mapping error {:?},eg: tcp:80-10.26.0.10:8080",
x
))?;
}
Ok(rs)
}