summaryrefslogtreecommitdiff
path: root/pkg/server/module/module.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server/module/module.go')
-rw-r--r--pkg/server/module/module.go55
1 files changed, 42 insertions, 13 deletions
diff --git a/pkg/server/module/module.go b/pkg/server/module/module.go
index 768a87b..87bdd20 100644
--- a/pkg/server/module/module.go
+++ b/pkg/server/module/module.go
@@ -2,16 +2,29 @@ package module
import (
"tunnel/pkg/server/queue"
+ "tunnel/pkg/server/opts"
+ "tunnel/pkg/server/env"
"fmt"
"log"
)
-var modules = map[string]M{}
+type moduleInitFunc func (opts.Opts, env.Env) (module, error)
-type pipe func (rq, wq queue.Q) error
+var modules = map[string]moduleInitFunc{}
+
+type module interface {
+ Open(env env.Env) (Pipe, Pipe)
+}
type M interface {
- Open() (pipe, pipe)
+ module
+ String() string
+}
+
+type Pipe func (rq, wq queue.Q) error
+
+func (p Pipe) Open(env env.Env) (Pipe, Pipe) {
+ return p, nil
}
type reverse struct {
@@ -22,27 +35,43 @@ func Reverse(m M) M {
return &reverse{m}
}
-func (r *reverse) Open() (pipe, pipe) {
- p1, p2 := r.M.Open()
+func (r *reverse) Open(env env.Env) (Pipe, Pipe) {
+ p1, p2 := r.M.Open(env)
return p2, p1
}
-func (p pipe) Open() (pipe, pipe) {
- return p, nil
+type named struct {
+ name string
+ module
+}
+
+func (m *named) String() string {
+ return fmt.Sprintf("module:%s", m.name)
}
-func register(name string, m M) {
+func register(name string, f moduleInitFunc) {
if _, ok := modules[name]; ok {
log.Panicf("duplicate module name '%s'", name)
}
- modules[name] = m
+ modules[name] = f
}
-func New(name string) (M, error) {
- if m, ok := modules[name]; ok {
- return m, nil
+func registerPipe(name string, p Pipe) {
+ register(name, func (opts.Opts, env.Env) (module, error) {
+ return p, nil
+ })
+}
+
+func New(desc string, env env.Env) (M, error) {
+ name, opts := opts.Parse(desc)
+
+ if f, ok := modules[name]; !ok {
+ return nil, fmt.Errorf("unknown module '%s'", name)
+ } else if m, err := f(opts, env); err != nil {
+ return nil, err
+ } else {
+ return &named{name: name, module: m}, nil
}
- return nil, fmt.Errorf("unknown module '%s'", name)
}