Skip to content

Commit

Permalink
Feature: make the selector proxies order as same as the order in the …
Browse files Browse the repository at this point in the history
…config file (#180)

* make the proxies order the same as the order in config file

* formatting & rename variable
  • Loading branch information
yeoleobun authored and Dreamacro committed May 15, 2019
1 parent 71a08ad commit 0eccbb0
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 14 deletions.
22 changes: 10 additions & 12 deletions adapters/outbound/selector.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ import (
"encoding/json"
"errors"
"net"
"sort"

C "github.com/Dreamacro/clash/constant"
)

type Selector struct {
*Base
selected C.Proxy
proxies map[string]C.Proxy
selected C.Proxy
proxies map[string]C.Proxy
proxyList []string
}

type SelectorOption struct {
Expand All @@ -33,15 +33,10 @@ func (s *Selector) SupportUDP() bool {
}

func (s *Selector) MarshalJSON() ([]byte, error) {
var all []string
for k := range s.proxies {
all = append(all, k)
}
sort.Strings(all)
return json.Marshal(map[string]interface{}{
"type": s.Type().String(),
"now": s.Now(),
"all": all,
"all": s.proxyList,
})
}

Expand All @@ -64,17 +59,20 @@ func NewSelector(name string, proxies []C.Proxy) (*Selector, error) {
}

mapping := make(map[string]C.Proxy)
for _, proxy := range proxies {
proxyList := make([]string, len(proxies))
for idx, proxy := range proxies {
mapping[proxy.Name()] = proxy
proxyList[idx] = proxy.Name()
}

s := &Selector{
Base: &Base{
name: name,
tp: C.Selector,
},
proxies: mapping,
selected: proxies[0],
proxies: mapping,
selected: proxies[0],
proxyList: proxyList,
}
return s, nil
}
8 changes: 6 additions & 2 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,13 +194,15 @@ func parseGeneral(cfg *rawConfig) (*General, error) {

func parseProxies(cfg *rawConfig) (map[string]C.Proxy, error) {
proxies := make(map[string]C.Proxy)
proxyList := []string{}
proxiesConfig := cfg.Proxy
groupsConfig := cfg.ProxyGroup

decoder := structure.NewDecoder(structure.Option{TagName: "proxy", WeaklyTypedInput: true})

proxies["DIRECT"] = adapters.NewProxy(adapters.NewDirect())
proxies["REJECT"] = adapters.NewProxy(adapters.NewReject())
proxyList = append(proxyList, "DIRECT", "REJECT")

// parse proxy
for idx, mapping := range proxiesConfig {
Expand Down Expand Up @@ -252,6 +254,7 @@ func parseProxies(cfg *rawConfig) (map[string]C.Proxy, error) {
return nil, fmt.Errorf("Proxy %s is the duplicate name", proxy.Name())
}
proxies[proxy.Name()] = adapters.NewProxy(proxy)
proxyList = append(proxyList, proxy.Name())
}

// parse proxy group
Expand Down Expand Up @@ -323,11 +326,12 @@ func parseProxies(cfg *rawConfig) (map[string]C.Proxy, error) {
return nil, fmt.Errorf("Proxy %s: %s", groupName, err.Error())
}
proxies[groupName] = adapters.NewProxy(group)
proxyList = append(proxyList, groupName)
}

ps := []C.Proxy{}
for _, v := range proxies {
ps = append(ps, v)
for _, v := range proxyList {
ps = append(ps, proxies[v])
}

global, _ := adapters.NewSelector("GLOBAL", ps)
Expand Down

0 comments on commit 0eccbb0

Please sign in to comment.