Clash.Meta/adapters/remote/selector.go

66 lines
1.1 KiB
Go
Raw Normal View History

package adapters
import (
"errors"
C "github.com/Dreamacro/clash/constant"
)
type Selector struct {
name string
selected C.Proxy
2018-07-18 21:50:16 +08:00
proxies map[string]C.Proxy
}
func (s *Selector) Name() string {
return s.name
}
func (s *Selector) Type() C.AdapterType {
return C.Selector
}
func (s *Selector) Generator(addr *C.Addr) (adapter C.ProxyAdapter, err error) {
return s.selected.Generator(addr)
}
func (s *Selector) Now() string {
return s.selected.Name()
}
func (s *Selector) All() []string {
var all []string
2018-07-18 21:50:16 +08:00
for k := range s.proxies {
all = append(all, k)
}
return all
}
func (s *Selector) Set(name string) error {
2018-07-18 21:50:16 +08:00
proxy, exist := s.proxies[name]
if !exist {
return errors.New("Proxy does not exist")
}
s.selected = proxy
return nil
}
2018-07-18 21:50:16 +08:00
func NewSelector(name string, proxies map[string]C.Proxy) (*Selector, error) {
if len(proxies) == 0 {
return nil, errors.New("Provide at least one proxy")
}
mapping := make(map[string]C.Proxy)
var init string
2018-07-18 21:50:16 +08:00
for k, v := range proxies {
mapping[k] = v
init = k
}
s := &Selector{
name: name,
2018-07-18 21:50:16 +08:00
proxies: mapping,
selected: proxies[init],
}
return s, nil
}