65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
|
package outbound
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/Dreamacro/clash/common/structure"
|
||
|
C "github.com/Dreamacro/clash/constant"
|
||
|
)
|
||
|
|
||
|
func ParseProxy(mapping map[string]interface{}) (C.Proxy, error) {
|
||
|
decoder := structure.NewDecoder(structure.Option{TagName: "proxy", WeaklyTypedInput: true})
|
||
|
proxyType, existType := mapping["type"].(string)
|
||
|
if !existType {
|
||
|
return nil, fmt.Errorf("Missing type")
|
||
|
}
|
||
|
|
||
|
var proxy C.ProxyAdapter
|
||
|
err := fmt.Errorf("Cannot parse")
|
||
|
switch proxyType {
|
||
|
case "ss":
|
||
|
ssOption := &ShadowSocksOption{}
|
||
|
err = decoder.Decode(mapping, ssOption)
|
||
|
if err != nil {
|
||
|
break
|
||
|
}
|
||
|
proxy, err = NewShadowSocks(*ssOption)
|
||
|
case "socks5":
|
||
|
socksOption := &Socks5Option{}
|
||
|
err = decoder.Decode(mapping, socksOption)
|
||
|
if err != nil {
|
||
|
break
|
||
|
}
|
||
|
proxy = NewSocks5(*socksOption)
|
||
|
case "http":
|
||
|
httpOption := &HttpOption{}
|
||
|
err = decoder.Decode(mapping, httpOption)
|
||
|
if err != nil {
|
||
|
break
|
||
|
}
|
||
|
proxy = NewHttp(*httpOption)
|
||
|
case "vmess":
|
||
|
vmessOption := &VmessOption{}
|
||
|
err = decoder.Decode(mapping, vmessOption)
|
||
|
if err != nil {
|
||
|
break
|
||
|
}
|
||
|
proxy, err = NewVmess(*vmessOption)
|
||
|
case "snell":
|
||
|
snellOption := &SnellOption{}
|
||
|
err = decoder.Decode(mapping, snellOption)
|
||
|
if err != nil {
|
||
|
break
|
||
|
}
|
||
|
proxy, err = NewSnell(*snellOption)
|
||
|
default:
|
||
|
return nil, fmt.Errorf("Unsupport proxy type: %s", proxyType)
|
||
|
}
|
||
|
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return NewProxy(proxy), nil
|
||
|
}
|