create pipeline package
This commit is contained in:
parent
2d78589836
commit
2ca81a3ef2
3 changed files with 79 additions and 0 deletions
37
pipe/pipe.go
Normal file
37
pipe/pipe.go
Normal file
|
@ -0,0 +1,37 @@
|
|||
package pipe
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/gob"
|
||||
)
|
||||
|
||||
type StreamItem struct {
|
||||
index int
|
||||
payload []byte
|
||||
}
|
||||
|
||||
func NewItem(index int, payload []byte) StreamItem {
|
||||
var buf bytes.Buffer
|
||||
w := StreamItem{index: index}
|
||||
if err := gob.NewEncoder(&buf).Encode(payload); err != nil {
|
||||
// assert no broken pipes
|
||||
panic(err)
|
||||
}
|
||||
w.payload = buf.Bytes()
|
||||
return w
|
||||
}
|
||||
|
||||
func (w *StreamItem) Index() int {
|
||||
return w.index
|
||||
}
|
||||
|
||||
func (w *StreamItem) Payload() []byte {
|
||||
var dec []byte
|
||||
buf := bytes.NewReader(w.payload)
|
||||
if err := gob.NewDecoder(buf).Decode(&dec); err != nil {
|
||||
// assert no broken pipes
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return dec
|
||||
}
|
7
pipe/pipeline.go
Normal file
7
pipe/pipeline.go
Normal file
|
@ -0,0 +1,7 @@
|
|||
package pipe
|
||||
|
||||
type Connector chan StreamItem
|
||||
|
||||
type Source func() chan StreamItem
|
||||
type Sink func(chan StreamItem)
|
||||
type Pipeline func(chan StreamItem) chan StreamItem
|
35
pipe/stream.go
Normal file
35
pipe/stream.go
Normal file
|
@ -0,0 +1,35 @@
|
|||
package pipe
|
||||
|
||||
type Pipelines []Pipeline
|
||||
|
||||
type Stream struct {
|
||||
nodes []Pipeline
|
||||
}
|
||||
|
||||
func New() *Stream {
|
||||
return &Stream{}
|
||||
}
|
||||
|
||||
// Use appends a pipeline processor to the Stream pipeline stack.
|
||||
func (s *Stream) Use(nodes ...Pipeline) {
|
||||
s.nodes = append(s.nodes, nodes...)
|
||||
}
|
||||
|
||||
func Chain(middlewares ...Pipeline) Pipelines {
|
||||
return Pipelines(middlewares)
|
||||
}
|
||||
|
||||
// chain builds a Connector composed of an inline pipeline stack and endpoint
|
||||
// processor in the order they are passed.
|
||||
func chain(nodes []Pipeline, src Connector) Connector {
|
||||
c := nodes[0](src)
|
||||
for i := 1; i < len(nodes); i++ {
|
||||
c = nodes[i](c)
|
||||
}
|
||||
return c
|
||||
}
|
||||
|
||||
// Handle registers a source and maps it to a sink.
|
||||
func (s *Stream) Handle(src Source, dest Sink) {
|
||||
dest(chain(s.nodes, src()))
|
||||
}
|
Loading…
Reference in a new issue