runnel-rs 0.2.0

A Rust proxy and tunnel toolbox with WireGuard-style, TUN, SOCKS, and TLS-based transports.
Documentation
use anyhow::{Result, bail};
use clap::ValueEnum;
use serde::Deserialize;
use std::fmt;

#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum ProxyMode {
    NativeHttp,
    NativeMux,
    DazeAshe,
    DazeBaboon,
    DazeCzar,
    Wg,
}

impl ProxyMode {
    pub fn as_str(self) -> &'static str {
        match self {
            ProxyMode::NativeHttp => "native-http",
            ProxyMode::NativeMux => "native-mux",
            ProxyMode::DazeAshe => "daze-ashe",
            ProxyMode::DazeBaboon => "daze-baboon",
            ProxyMode::DazeCzar => "daze-czar",
            ProxyMode::Wg => "wg",
        }
    }

    pub fn from_legacy_mux(mux: bool, mode: ProxyMode) -> Result<ProxyMode> {
        if mux {
            match mode {
                ProxyMode::NativeHttp => Ok(ProxyMode::NativeMux),
                ProxyMode::NativeMux => Ok(ProxyMode::NativeMux),
                ProxyMode::DazeAshe | ProxyMode::DazeBaboon | ProxyMode::DazeCzar => {
                    bail!("--mux cannot be combined with a daze mode")
                }
                ProxyMode::Wg => {
                    bail!("--mux cannot be combined with wg mode")
                }
            }
        } else {
            Ok(mode)
        }
    }
}

impl fmt::Display for ProxyMode {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_str((*self).as_str())
    }
}