diff options
Diffstat (limited to 'pkg/server/module')
| -rw-r--r-- | pkg/server/module/alpha.go | 32 | ||||
| -rw-r--r-- | pkg/server/module/hex.go | 27 | ||||
| -rw-r--r-- | pkg/server/module/module.go | 48 |
3 files changed, 107 insertions, 0 deletions
diff --git a/pkg/server/module/alpha.go b/pkg/server/module/alpha.go new file mode 100644 index 0000000..be9032c --- /dev/null +++ b/pkg/server/module/alpha.go @@ -0,0 +1,32 @@ +package module + +import ( + "tunnel/pkg/server/queue" + "unicode" + "bufio" + "io" +) + +func alpha(cb func (rune) rune) pipe { + return func (rq, wq queue.Q) error { + r := bufio.NewReader(rq.Reader()) + + for { + c, _, err := r.ReadRune() + if err != nil { + if err == io.EOF { + break + } + return err + } + wq <- []byte(string(cb(c))) + } + + return nil + } +} + +func init() { + register("lower", alpha(unicode.ToLower)) + register("upper", alpha(unicode.ToUpper)) +} diff --git a/pkg/server/module/hex.go b/pkg/server/module/hex.go new file mode 100644 index 0000000..2ffd1fc --- /dev/null +++ b/pkg/server/module/hex.go @@ -0,0 +1,27 @@ +package module + +import ( + "tunnel/pkg/server/queue" + "encoding/hex" +) + +func hexEncoder(rq, wq queue.Q) error { + enc := hex.NewEncoder(wq.Writer()) + + for b := range rq { + enc.Write(b) + } + + return nil +} + +func hexDecoder(rq, wq queue.Q) error { + r := hex.NewDecoder(rq.Reader()) + w := wq.Writer() + return queue.IoCopy(r, w) +} + +func init() { + register("hex", pipe(hexEncoder)) + register("unhex", pipe(hexDecoder)) +} 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) +} |
