From de868930e2301b68a50bde088dd83dc575b72c54 Mon Sep 17 00:00:00 2001 From: Mikhail Osipov Date: Sun, 23 Feb 2020 05:20:04 +0300 Subject: prepare to auth --- pkg/server/module/module.go | 55 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 13 deletions(-) (limited to 'pkg/server/module/module.go') 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) } -- cgit v1.2.3-70-g09d2