summaryrefslogtreecommitdiff
path: root/pkg/server/hook/hook.go
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2021-03-08 02:25:01 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2021-03-08 02:25:01 +0300
commita6e6d848d6f719710a43ca015027bd93befb721d (patch)
tree8cd94dfb8f466ca9403072c76883d95b41fbe0ef /pkg/server/hook/hook.go
parent95ae97eb7eaa268a06bc2b90184eaed6342b3142 (diff)
add cmd, hook, socket help
Diffstat (limited to 'pkg/server/hook/hook.go')
-rw-r--r--pkg/server/hook/hook.go48
1 files changed, 36 insertions, 12 deletions
diff --git a/pkg/server/hook/hook.go b/pkg/server/hook/hook.go
index 36b01d4..1464272 100644
--- a/pkg/server/hook/hook.go
+++ b/pkg/server/hook/hook.go
@@ -12,7 +12,17 @@ import (
"tunnel/pkg/server/queue"
)
-var hooks = map[string]interface{}{}
+type Type struct {
+ Name string
+ Desc string
+ Func bool
+
+ Param []opts.Param
+
+ data interface{}
+}
+
+var hooks = map[string]*Type{}
type Pipe struct {
priv interface{}
@@ -112,9 +122,9 @@ func New(desc string) (H, error) {
reverse = true
}
- if i, ok := hooks[name]; !ok {
+ if hookType, ok := hooks[name]; !ok {
return nil, fmt.Errorf("unknown hook '%s'", name)
- } else if h, err := initHook(i, opts); err != nil {
+ } else if h, err := initHook(hookType.data, opts); err != nil {
return nil, fmt.Errorf("%s: %w", name, err)
} else {
w := &wrapper{
@@ -126,29 +136,39 @@ func New(desc string) (H, error) {
}
}
-func register(name string, i interface{}) {
+func register(name string, desc string, i interface{}) {
+ var param []opts.Param
+
switch t := reflect.TypeOf(i); t.Kind() {
case reflect.Struct:
if _, ok := reflect.New(t).Interface().(Hooker); !ok {
- log.Panicf("uncompatible hook type '%s'", t.String())
+ log.Panicf("uncompatible hook type '%s'", t)
}
+ param = opts.Parametrize(t)
case reflect.Func:
if _, ok := i.(Func); !ok {
- log.Panicf("uncompatible func type '%s'", t.String())
+ log.Panicf("uncompatible func type '%s'", t)
}
default:
- log.Panicf("non-struct and non-func type '%s'", t.String())
+ log.Panicf("non-struct and non-func type '%s'", t)
}
if _, ok := hooks[name]; ok {
log.Panicf("duplicate hook name '%s'", name)
}
- hooks[name] = i
+ hooks[name] = &Type{
+ Name: name,
+ Desc: desc,
+
+ Param: param,
+
+ data: i,
+ }
}
-func registerFunc(name string, f Func) {
- register(name, f)
+func registerFunc(name string, desc string, f Func) {
+ register(name, desc, f)
}
type pipeHolder struct {
@@ -159,8 +179,8 @@ func (p pipeHolder) New(env.Env) (interface{}, error) {
return p.i, nil
}
-func registerPipe(name string, i interface{}) {
- register(name, pipeHolder{i})
+func registerPipe(name string, desc string, i interface{}) {
+ register(name, desc, pipeHolder{i})
}
func GetList() []string {
@@ -174,3 +194,7 @@ func GetList() []string {
return list
}
+
+func GetType(name string) *Type {
+ return hooks[name]
+}