Python 3.7 新特性
# -*- encoding:utf-8 -*-
"""
@ Created by Seven on 2018/10/26
"""
from enum import Enum
from dataclasses import dataclass
from typing import Optional, Any, List, TypeVar, Type, Callable, cast
T = TypeVar("T")
EnumT = TypeVar("EnumT", bound=Enum)
def from_bool(x: Any) -> bool:
assert isinstance(x, bool)
return x
def from_str(x: Any) -> str:
assert isinstance(x, str)
return x
def from_int(x: Any) -> int:
assert isinstance(x, int) and not isinstance(x, bool)
return x
def from_none(x: Any) -> Any:
assert x is None
return x
def from_union(fs, x):
for f in fs:
try:
return f(x)
except:
pass
assert False
def to_enum(c: Type[EnumT], x: Any) -> EnumT:
assert isinstance(x, c)
return x.value
def from_list(f: Callable[[Any], T], x: Any) -> List[T]:
assert isinstance(x, list)
return [f(y) for y in x]
def to_class(c: Type[T], x: Any) -> dict:
assert isinstance(x, c)
return cast(Any, x).to_dict()
class Group(Enum):
SS = "SS"
SSR = "SSR"
class Method(Enum):
AES_256_CFB = "aes-256-cfb"
CHACHA20_IETF = "chacha20-ietf"
class Obfs(Enum):
HTTP_SIMPLE = "http_simple"
PLAIN = "plain"
TLS1_2__TICKET_AUTH = "tls1.2_ticket_auth"
class Password(Enum):
SOO9S_COM = "soo9s.com"
SOO9S_ME = "soo9s.me"
class Protocol(Enum):
AUTH_AES128_MD5 = "auth_aes128_md5"
AUTH_AES128_SHA1 = "auth_aes128_sha1"
AUTH_CHAIN_A = "auth_chain_a"
class Protocolparam(Enum):
THE_5113_CCT_IN_W = "5113:cctInW"
@dataclass
class Config:
enable: bool
password: Password
method: Method
remarks: str
server: str
obfs: Obfs
protocol: Protocol
protocolparam: Protocolparam
group: Group
server_port: int
remarks_base64: str
obfsparam: Optional[str]
@staticmethod
def from_dict(obj: Any) -> 'Config':
assert isinstance(obj, dict)
enable = from_bool(obj.get("enable"))
password = Password(obj.get("password"))
method = Method(obj.get("method"))
remarks = from_str(obj.get("remarks"))
server = from_str(obj.get("server"))
obfs = Obfs(obj.get("obfs"))
protocol = Protocol(obj.get("protocol"))
protocolparam = Protocolparam(obj.get("protocolparam"))
group = Group(obj.get("group"))
server_port = from_int(obj.get("server_port"))
remarks_base64 = from_str(obj.get("remarks_base64"))
obfsparam = from_union([from_str, from_none], obj.get("obfsparam"))
return Config(enable, password, method, remarks, server, obfs, protocol, protocolparam, group, server_port, remarks_base64, obfsparam)
def to_dict(self) -> dict:
result: dict = {}
result["enable"] = from_bool(self.enable)
result["password"] = to_enum(Password, self.password)
result["method"] = to_enum(Method, self.method)
result["remarks"] = from_str(self.remarks)
result["server"] = from_str(self.server)
result["obfs"] = to_enum(Obfs, self.obfs)
result["protocol"] = to_enum(Protocol, self.protocol)
result["protocolparam"] = to_enum(Protocolparam, self.protocolparam)
result["group"] = to_enum(Group, self.group)
result["server_port"] = from_int(self.server_port)
result["remarks_base64"] = from_str(self.remarks_base64)
result["obfsparam"] = from_union([from_str, from_none], self.obfsparam)
return result
@dataclass
class Export:
random: bool
auth_pass: None
use_online_pac: bool
ttl: int
export_global: bool
reconnect_times: int
index: int
proxy_type: int
proxy_host: None
auth_user: None
proxy_auth_pass: None
is_default: bool
pac_url: None
configs: List[Config]
proxy_port: int
random_algorithm: int
proxy_enable: bool
enabled: bool
autoban: bool
proxy_auth_user: None
share_over_lan: bool
local_port: int
@staticmethod
def from_dict(obj: Any) -> 'Export':
assert isinstance(obj, dict)
random = from_bool(obj.get("random"))
auth_pass = from_none(obj.get("authPass"))
use_online_pac = from_bool(obj.get("useOnlinePac"))
ttl = from_int(obj.get("TTL"))
export_global = from_bool(obj.get("global"))
reconnect_times = from_int(obj.get("reconnectTimes"))
index = from_int(obj.get("index"))
proxy_type = from_int(obj.get("proxyType"))
proxy_host = from_none(obj.get("proxyHost"))
auth_user = from_none(obj.get("authUser"))
proxy_auth_pass = from_none(obj.get("proxyAuthPass"))
is_default = from_bool(obj.get("isDefault"))
pac_url = from_none(obj.get("pacUrl"))
configs = from_list(Config.from_dict, obj.get("configs"))
proxy_port = from_int(obj.get("proxyPort"))
random_algorithm = from_int(obj.get("randomAlgorithm"))
proxy_enable = from_bool(obj.get("proxyEnable"))
enabled = from_bool(obj.get("enabled"))
autoban = from_bool(obj.get("autoban"))
proxy_auth_user = from_none(obj.get("proxyAuthUser"))
share_over_lan = from_bool(obj.get("shareOverLan"))
local_port = from_int(obj.get("localPort"))
return Export(random, auth_pass, use_online_pac, ttl, export_global, reconnect_times, index, proxy_type, proxy_host, auth_user, proxy_auth_pass, is_default, pac_url, configs, proxy_port, random_algorithm, proxy_enable, enabled, autoban, proxy_auth_user, share_over_lan, local_port)
def to_dict(self) -> dict:
result: dict = {}
result["random"] = from_bool(self.random)
result["authPass"] = from_none(self.auth_pass)
result["useOnlinePac"] = from_bool(self.use_online_pac)
result["TTL"] = from_int(self.ttl)
result["global"] = from_bool(self.export_global)
result["reconnectTimes"] = from_int(self.reconnect_times)
result["index"] = from_int(self.index)
result["proxyType"] = from_int(self.proxy_type)
result["proxyHost"] = from_none(self.proxy_host)
result["authUser"] = from_none(self.auth_user)
result["proxyAuthPass"] = from_none(self.proxy_auth_pass)
result["isDefault"] = from_bool(self.is_default)
result["pacUrl"] = from_none(self.pac_url)
result["configs"] = from_list(lambda x: to_class(Config, x), self.configs)
result["proxyPort"] = from_int(self.proxy_port)
result["randomAlgorithm"] = from_int(self.random_algorithm)
result["proxyEnable"] = from_bool(self.proxy_enable)
result["enabled"] = from_bool(self.enabled)
result["autoban"] = from_bool(self.autoban)
result["proxyAuthUser"] = from_none(self.proxy_auth_user)
result["shareOverLan"] = from_bool(self.share_over_lan)
result["localPort"] = from_int(self.local_port)
return result
def export_from_dict(s: Any) -> Export:
return Export.from_dict(s)
def export_to_dict(x: Export) -> Any:
return to_class(Export, x)
Tags: None
Archives QR Code