-
Notifications
You must be signed in to change notification settings - Fork 1
/
sed.go
71 lines (54 loc) · 1.72 KB
/
sed.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
package filter
import (
"fmt"
"strings"
"github.com/Sirupsen/logrus"
"github.com/marema31/kamino/provider/types"
"github.com/rwtodd/Go.Sed/sed"
)
// SedFilter specific type for sed filter operation.
type SedFilter struct {
engines map[string]*sed.Engine
regexps map[string]string
log *logrus.Entry
}
func newSedFilter(log *logrus.Entry, mParam map[string]string) (Filter, error) {
logFilter := log.WithField("filter", "sed")
if mParam == nil {
logFilter.Error("Missing MParameters")
return nil, fmt.Errorf("no parameter to filter sed: %w", errMissingParameter)
}
if len(mParam) == 0 {
logFilter.Error("Refuse to filter nothing")
return nil, fmt.Errorf("filter Sed refuse to sed nothing: %w", errWrongParameterValue)
}
engines := make(map[string]*sed.Engine)
regexps := make(map[string]string)
logFilter.Info("Will apply sed filter on:")
for name, value := range mParam {
engine, err := sed.New(strings.NewReader(value))
if err != nil {
log.Errorf("unable to parse the sed expression for %s (%s): %v", name, value, err)
return nil, err
}
engines[name] = engine
regexps[name] = value
logFilter.Infof(" - %s : %s", name, value)
}
return &SedFilter{engines: engines, regexps: regexps, log: logFilter}, nil
}
// Filter : Sed the content of column by provided values (insert the column if not present).
func (sf *SedFilter) Filter(in types.Record) (types.Record, error) {
out := make(types.Record, len(in))
for col, value := range in {
out[col] = value
}
for col, engine := range sf.engines {
value, err := engine.RunString(in[col])
if err != nil {
sf.log.Errorf("unable to execute sed expression (%s) on %s: %v", sf.regexps[col], in[col], err)
}
out[col] = value
}
return out, nil
}