/
override.go
58 lines (49 loc) · 1.42 KB
/
override.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
package iterator
import (
"io"
"reflect"
)
type OverrideIterator struct {
valueIterator Iterator
OverrideValue Iterator
}
// NewOverrideIterator create a new iterator which can be override with other values
func NewOverrideIterator(valueIterator Iterator, overrideValue Iterator) *OverrideIterator {
return &OverrideIterator{
valueIterator: valueIterator,
OverrideValue: overrideValue,
}
}
// MarshalJSON return the value in a json compatible value
func (i *OverrideIterator) MarshalJSON() (line []byte, err error) {
return MarshalJSON(i)
}
// IsBound return true if the iterator is bound
func (i *OverrideIterator) IsBound() bool {
return true
}
func (i *OverrideIterator) GetNext() (value []byte, input interface{}, err error) {
if i.valueIterator == nil {
return nil, nil, io.EOF
}
value, rawValue, err := i.valueIterator.GetNext()
if err == io.EOF && len(value) > 0 {
// ignore EOF if the value is not empty
err = nil
}
// override the value if it is not nil
if i.OverrideValue != nil && !reflect.ValueOf(i.OverrideValue).IsNil() {
overrideValue, _, overrideErr := i.OverrideValue.GetNext()
if overrideErr != nil {
if i.valueIterator.IsBound() && overrideErr == io.EOF {
// ignore as the other iterator is bound, so let it control the loop
} else {
return overrideValue, rawValue, overrideErr
}
}
if len(overrideValue) > 0 {
value = overrideValue
}
}
return value, rawValue, err
}