Skip to content

Commit 22224ae

Browse files
committed
new: introduce JSON path setters (syntax extension)
Signed-off-by: Leonardo Di Donato <[email protected]>
1 parent 3065431 commit 22224ae

File tree

1 file changed

+32
-8
lines changed

1 file changed

+32
-8
lines changed

plugin.go

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ type JSONSelectEncoder struct {
4141
zapcore.Encoder `json:"-"`
4242
Selector string `json:"selector,omitempty"`
4343

44-
keys [][]string
44+
getters [][]string
45+
setters [][]string
4546
}
4647

4748
func (JSONSelectEncoder) CaddyModule() caddy.ModuleInfo {
@@ -60,14 +61,34 @@ func (e *JSONSelectEncoder) Provision(ctx caddy.Context) error {
6061
return fmt.Errorf("selector is mandatory")
6162
}
6263

63-
e.keys = [][]string{}
64+
e.setters = [][]string{}
65+
e.getters = [][]string{}
6466
r := caddy.NewReplacer()
65-
r.Map(func(key string) (interface{}, bool) {
66-
e.keys = append(e.keys, strings.Split(key, ">"))
67+
r.Map(func(sel string) (interface{}, bool) {
68+
var set, get string
69+
70+
parts := strings.Split(sel, ":")
71+
if len(parts) == 1 {
72+
set = parts[0]
73+
get = set
74+
} else if len(parts) == 2 {
75+
set = parts[0]
76+
get = parts[1]
77+
} else {
78+
// todo > error out - how?
79+
return nil, false
80+
}
81+
82+
e.setters = append(e.setters, strings.Split(set, ">"))
83+
e.getters = append(e.getters, strings.Split(get, ">"))
6784
return nil, false
6885
})
6986
r.ReplaceAll(e.Selector, "")
7087

88+
if len(e.setters) != len(e.getters) {
89+
return fmt.Errorf("selector must have the same number of setters and getters")
90+
}
91+
7192
e.Encoder = zapcore.NewJSONEncoder(e.ZapcoreEncoderConfig())
7293
return nil
7394
}
@@ -77,7 +98,8 @@ func (e JSONSelectEncoder) Clone() zapcore.Encoder {
7798
LogEncoderConfig: e.LogEncoderConfig,
7899
Encoder: e.Encoder.Clone(),
79100
Selector: e.Selector,
80-
keys: e.keys,
101+
getters: e.getters,
102+
setters: e.setters,
81103
}
82104
}
83105

@@ -93,13 +115,15 @@ func (e JSONSelectEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Fie
93115
func(idx int, val []byte, typ jsonparser.ValueType, err error) {
94116
// todo > handle error
95117
switch typ {
118+
case jsonparser.NotExist:
119+
// path not found, skip
96120
case jsonparser.String:
97-
res, _ = jsonparser.Set(res, append(append([]byte{'"'}, val...), '"'), e.keys[idx]...)
121+
res, _ = jsonparser.Set(res, append(append([]byte{'"'}, val...), '"'), e.setters[idx]...)
98122
default:
99-
res, _ = jsonparser.Set(res, val, e.keys[idx]...)
123+
res, _ = jsonparser.Set(res, val, e.setters[idx]...)
100124
}
101125
},
102-
e.keys...,
126+
e.getters...,
103127
)
104128

105129
// Reset the buffer to output our own content

0 commit comments

Comments
 (0)