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) }