diff options
Diffstat (limited to 'pkg/server/module/module.go')
| -rw-r--r-- | pkg/server/module/module.go | 55 |
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) } |
