shadowsocks_rust/vparser/
mod.rs

1//! Command line argument validator
2
3#![allow(dead_code)]
4
5use std::net::{IpAddr, SocketAddr};
6
7#[cfg(any(feature = "local-tun", feature = "local-fake-dns"))]
8use ipnet::IpNet;
9#[cfg(feature = "local-redir")]
10use shadowsocks_service::config::RedirType;
11#[cfg(feature = "local-dns")]
12use shadowsocks_service::local::dns::NameServerAddr;
13use shadowsocks_service::{
14    config::{ManagerServerHost, ManagerServerMode},
15    shadowsocks::{ManagerAddr, ServerAddr, ServerConfig, crypto::CipherKind, relay::socks5::Address},
16};
17
18macro_rules! value_parser_type {
19    ($name:ident, $ty:ty, $help:expr) => {
20        pub fn $name(v: &str) -> Result<$ty, String> {
21            match v.parse::<$ty>() {
22                Ok(t) => Ok(t),
23                Err(..) => Err($help.to_owned()),
24            }
25        }
26    };
27}
28
29value_parser_type!(parse_server_addr, ServerAddr, "should be either ip:port or domain:port");
30value_parser_type!(parse_ip_addr, IpAddr, "should be a valid IPv4 or IPv6 address");
31value_parser_type!(parse_socket_addr, SocketAddr, "should be ip:port");
32value_parser_type!(parse_address, Address, "should be either ip:port or domain:port");
33value_parser_type!(
34    parse_manager_addr,
35    ManagerAddr,
36    "should be either ip:port, domain:port or /path/to/unix.sock"
37);
38value_parser_type!(parse_manager_server_host, ManagerServerHost, "invalid server-host");
39value_parser_type!(
40    parse_manager_server_mode,
41    ManagerServerMode,
42    "should be \"builtin\" or \"standalone\""
43);
44#[cfg(feature = "local-dns")]
45value_parser_type!(
46    parse_name_server_addr,
47    NameServerAddr,
48    "should be either ip:port or a path to unix domain socket"
49);
50value_parser_type!(parse_cipher_kind, CipherKind, "invalid cipher");
51
52pub fn parse_server_url(v: &str) -> Result<ServerConfig, String> {
53    match ServerConfig::from_url(v) {
54        Ok(t) => Ok(t),
55        Err(..) => Err("should be SIP002 (https://shadowsocks.org/doc/sip002.html) format".to_owned()),
56    }
57}
58
59#[cfg(any(feature = "local-tun", feature = "local-fake-dns"))]
60pub fn parse_ipnet(v: &str) -> Result<IpNet, String> {
61    match v.parse::<IpNet>() {
62        Err(..) => Err("should be a CIDR address like 10.1.2.3/24".to_owned()),
63        Ok(n) => Ok(n),
64    }
65}
66
67#[cfg(feature = "local-redir")]
68value_parser_type!(parse_redir_type, RedirType, "invalid redir-type");