-
Notifications
You must be signed in to change notification settings - Fork 74
/
metadatacopy.go
139 lines (123 loc) · 4.08 KB
/
metadatacopy.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// Copyright 2015-2017 trivago GmbH
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package format
import (
"strings"
"github.com/trivago/gollum/core"
)
// MetadataCopy formatter plugin
//
// This formatter sets metadata fields by copying data from the message's
// payload or from other metadata fields.
//
// Parameters
//
// - Key: Defines the key to copy, i.e. the "source". ApplyTo will define
// the target of the copy, i.e. the "destination". An empty string will
// use the message payload as source.
// By default this parameter is set to an empty string (i.e. payload).
//
// - Mode: Defines the copy mode to use. This can be one of "append",
// "prepend" or "replace".
// By default this parameter is set to "replace".
//
// - Separator: When using mode prepend or append, defines the characters
// inserted between source and destination.
// By default this parameter is set to an empty string.
//
// - CopyToKeys: DEPRECATED. A list of meta data keys to copy the payload
// or metadata content to. If this field contains at least one value, mode
// is set to replace and the key field is ignored.
// By default this parameter is set to an empty list.
//
// Examples
//
// This example copies the payload to the field key and applies a hash on
// it contain a hash over the complete payload.
//
// exampleConsumer:
// Type: consumer.Console
// Streams: "*"
// Modulators:
// - format.MetadataCopy:
// ApplyTo: key
// - formatter.Identifier
// Generator: hash
// ApplyTo: key
//
type MetadataCopy struct {
core.SimpleFormatter `gollumdoc:"embed_type"`
key string `config:"Key"`
separator []byte `config:"Separator"`
metaDataKeys []string `config:"CopyToKeys"` // deprecated
mode metadataCopyMode
}
type metadataCopyMode int
const (
metadataCopyModeAppend = metadataCopyMode(iota)
metadataCopyModeReplace = metadataCopyMode(iota)
metadataCopyModePrepend = metadataCopyMode(iota)
)
func init() {
core.TypeRegistry.Register(MetadataCopy{})
}
// Configure initializes this formatter with values from a plugin config.
func (format *MetadataCopy) Configure(conf core.PluginConfigReader) {
mode := conf.GetString("Mode", "replace")
switch strings.ToLower(mode) {
case "replace":
format.mode = metadataCopyModeReplace
case "append":
format.mode = metadataCopyModeAppend
case "prepend":
format.mode = metadataCopyModePrepend
default:
conf.Errors.Pushf("mode must be one of replace, append or prepend")
}
}
// ApplyFormatter update message payload
func (format *MetadataCopy) ApplyFormatter(msg *core.Message) error {
if len(format.metaDataKeys) > 0 {
// DEPRECATED
// This codepath will be removed in 0.6
meta := msg.GetMetadata()
data := format.GetAppliedContent(msg)
pool := core.MessageDataPool
for _, key := range format.metaDataKeys {
bufferCopy := pool.Get(len(data))
copy(bufferCopy, data)
meta.SetValue(key, bufferCopy)
}
return nil
}
getSourceData := core.GetAppliedContentGetFunction(format.key)
srcData := getSourceData(msg)
switch format.mode {
case metadataCopyModeReplace:
format.SetAppliedContent(msg, srcData)
case metadataCopyModePrepend:
dstData := format.GetAppliedContent(msg)
if len(format.separator) != 0 {
srcData = append(srcData, format.separator...)
}
format.SetAppliedContent(msg, append(srcData, dstData...))
case metadataCopyModeAppend:
dstData := format.GetAppliedContent(msg)
if len(format.separator) != 0 {
dstData = append(dstData, format.separator...)
}
format.SetAppliedContent(msg, append(dstData, srcData...))
}
return nil
}