summaryrefslogtreecommitdiff
path: root/pkg/server/module/module.go
blob: 768a87bb832d4fe03c2573a820cca5c8367a8e09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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)
}