bring back yahoo pipes!
1package engine
2
3import (
4 "fmt"
5 "sync"
6
7 "github.com/kierank/pipes/nodes"
8 "github.com/kierank/pipes/nodes/outputs"
9 "github.com/kierank/pipes/nodes/sources"
10 "github.com/kierank/pipes/nodes/transforms"
11)
12
13type Registry struct {
14 mu sync.RWMutex
15 nodeImpls map[string]nodes.Node
16}
17
18func NewRegistry() *Registry {
19 r := &Registry{
20 nodeImpls: make(map[string]nodes.Node),
21 }
22
23 // Register built-in nodes
24 // Sources
25 r.Register(&sources.RSSSourceNode{})
26 r.Register(&sources.HTTPSourceNode{})
27
28 // Transforms
29 r.Register(&transforms.FilterNode{})
30 r.Register(&transforms.SortNode{})
31 r.Register(&transforms.LimitNode{})
32 r.Register(&transforms.MergeNode{})
33 r.Register(&transforms.MapNode{})
34 r.Register(&transforms.RegexNode{})
35 r.Register(&transforms.TruncateNode{})
36
37 // Outputs
38 r.Register(&outputs.JSONOutputNode{})
39 r.Register(&outputs.RSSOutputNode{})
40 r.Register(&outputs.WebhookOutputNode{})
41
42 return r
43}
44
45func (r *Registry) Register(node nodes.Node) {
46 r.mu.Lock()
47 defer r.mu.Unlock()
48 r.nodeImpls[node.Type()] = node
49}
50
51func (r *Registry) Get(nodeType string) (nodes.Node, error) {
52 r.mu.RLock()
53 defer r.mu.RUnlock()
54
55 node, ok := r.nodeImpls[nodeType]
56 if !ok {
57 return nil, fmt.Errorf("unknown node type: %s", nodeType)
58 }
59
60 return node, nil
61}
62
63func (r *Registry) GetAll() []nodes.Node {
64 r.mu.RLock()
65 defer r.mu.RUnlock()
66
67 nodeList := make([]nodes.Node, 0, len(r.nodeImpls))
68 for _, node := range r.nodeImpls {
69 nodeList = append(nodeList, node)
70 }
71
72 return nodeList
73}