/
select.go
75 lines (58 loc) · 2.12 KB
/
select.go
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package dynaml
import (
"github.com/mandelsoft/spiff/yaml"
)
///////////////////////////////////////////////////////////////////////////////
// select to list context
///////////////////////////////////////////////////////////////////////////////
type selectToListContext struct {
defaultContext
}
var SelectToListContext = &selectToListContext{defaultContext{brackets: "[]", keyword: "select", list: true}}
func (c *selectToListContext) CreateMappingAggregation(source interface{}) MappingAggregation {
return &selectToList{MapperForSource(source), []yaml.Node{}}
}
type selectToList struct {
mapper Mapper
result []yaml.Node
}
func (m *selectToList) DoMapping(inline bool, value interface{}, e LambdaValue, binding Binding) (interface{}, EvaluationInfo, bool) {
return m.mapper(inline, value, e, binding, m)
}
func (m *selectToList) Add(key interface{}, value interface{}, n yaml.Node, info EvaluationInfo) error {
if info.Undefined || value == nil || !toBool(value) {
return nil
}
m.result = append(m.result, n)
return nil
}
func (m *selectToList) Result() interface{} {
return m.result
}
///////////////////////////////////////////////////////////////////////////////
// select to map context
///////////////////////////////////////////////////////////////////////////////
type selectToMapContext struct {
defaultContext
}
var SelectToMapContext = &selectToMapContext{defaultContext{brackets: "{}", keyword: "select", list: false}}
func (c *selectToMapContext) CreateMappingAggregation(source interface{}) MappingAggregation {
return &selectToMap{MapperForSource(source), map[string]yaml.Node{}}
}
type selectToMap struct {
mapper Mapper
result map[string]yaml.Node
}
func (m *selectToMap) DoMapping(inline bool, value interface{}, e LambdaValue, binding Binding) (interface{}, EvaluationInfo, bool) {
return m.mapper(inline, value, e, binding, m)
}
func (m *selectToMap) Add(key interface{}, value interface{}, n yaml.Node, info EvaluationInfo) error {
if info.Undefined || value == nil || !toBool(value) {
return nil
}
m.result[key.(string)] = n
return nil
}
func (m *selectToMap) Result() interface{} {
return m.result
}