diff options
Diffstat (limited to 'pkg/server/module/module.go')
| -rw-r--r-- | pkg/server/module/module.go | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/pkg/server/module/module.go b/pkg/server/module/module.go new file mode 100644 index 0000000..768a87b --- /dev/null +++ b/pkg/server/module/module.go @@ -0,0 +1,48 @@ +package module + +import ( + "tunnel/pkg/server/queue" + "fmt" + "log" +) + +var modules = map[string]M{} + +type pipe func (rq, wq queue.Q) error + +type M interface { + Open() (pipe, pipe) +} + +type reverse struct { + M +} + +func Reverse(m M) M { + return &reverse{m} +} + +func (r *reverse) Open() (pipe, pipe) { + p1, p2 := r.M.Open() + return p2, p1 +} + +func (p pipe) Open() (pipe, pipe) { + return p, nil +} + +func register(name string, m M) { + if _, ok := modules[name]; ok { + log.Panicf("duplicate module name '%s'", name) + } + + modules[name] = m +} + +func New(name string) (M, error) { + if m, ok := modules[name]; ok { + return m, nil + } + + return nil, fmt.Errorf("unknown module '%s'", name) +} |
