gost_software/options.go
2017-07-18 18:19:36 +08:00

69 lines
1.4 KiB
Go

package gost
import (
"log"
"reflect"
)
// Options holds options of node
type Options interface {
BaseOptions() *BaseOptions
}
type Option func(Options)
type BaseOptions struct {
Addr string `opt:"addr"` // [host]:port
Protocol string `opt:"protocol"` // protocol: http/socks5/ss
Transport string `opt:"transport"` // transport: ws/wss/tls/http2/tcp/udp/rtcp/rudp
}
func AddrOption(a string) Option {
return func(opts Options) {
opts.BaseOptions().Addr = a
}
}
func ProtocolOption(p string) Option {
return func(opts Options) {
opts.BaseOptions().Protocol = p
}
}
func TransportOption(t string) Option {
return func(opts Options) {
opts.BaseOptions().Transport = t
}
}
func GetOption(i interface{}, opt string) interface{} {
ps := reflect.ValueOf(i)
if ps.Kind() != reflect.Ptr && ps.Kind() != reflect.Interface {
return nil
}
s := ps.Elem()
for n := 0; n < s.NumField(); n++ {
log.Println("tag:", s.Type().Field(n).Tag.Get("opt"))
if opt == s.Type().Field(n).Tag.Get("opt") && s.Field(n).CanInterface() {
// return s.Field(n).Interface()
}
}
return nil
}
func SetOption(i interface{}, opt string, v interface{}) {
ps := reflect.ValueOf(i)
if ps.Kind() != reflect.Ptr || ps.Kind() != reflect.Interface {
return
}
s := ps.Elem()
for n := 0; n < s.NumField(); n++ {
if opt == s.Type().Field(n).Tag.Get("opt") &&
s.Field(n).IsValid() && s.Field(n).CanSet() {
s.Field(n).Set(reflect.ValueOf(v))
return
}
}
}