-
Notifications
You must be signed in to change notification settings - Fork 217
/
add_metadata.go
119 lines (102 loc) · 3.17 KB
/
add_metadata.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
package transcoder
import (
cloudevents "github.com/cloudevents/sdk-go"
"github.com/cloudevents/sdk-go/pkg/binding"
"github.com/cloudevents/sdk-go/pkg/binding/spec"
)
// Add cloudevents attribute (if missing) during the encoding process
func AddAttribute(attributeKind spec.Kind, value interface{}) binding.TransformerFactory {
return setAttributeTranscoderFactory{attributeKind: attributeKind, value: value}
}
// Add cloudevents extension (if missing) during the encoding process
func AddExtension(name string, value interface{}) binding.TransformerFactory {
return setExtensionTranscoderFactory{name: name, value: value}
}
type setAttributeTranscoderFactory struct {
attributeKind spec.Kind
value interface{}
}
func (a setAttributeTranscoderFactory) StructuredTransformer(binding.StructuredEncoder) binding.StructuredEncoder {
return nil
}
func (a setAttributeTranscoderFactory) BinaryTransformer(encoder binding.BinaryEncoder) binding.BinaryEncoder {
return &setAttributeTransformer{
BinaryEncoder: encoder,
attributeKind: a.attributeKind,
value: a.value,
found: false,
}
}
func (a setAttributeTranscoderFactory) EventTransformer() binding.EventTransformer {
return func(event *cloudevents.Event) error {
v, err := spec.VS.Version(event.SpecVersion())
if err != nil {
return err
}
if v.AttributeFromKind(a.attributeKind).Get(event.Context) == nil {
return v.AttributeFromKind(a.attributeKind).Set(event.Context, a.value)
}
return nil
}
}
type setExtensionTranscoderFactory struct {
name string
value interface{}
}
func (a setExtensionTranscoderFactory) StructuredTransformer(binding.StructuredEncoder) binding.StructuredEncoder {
return nil
}
func (a setExtensionTranscoderFactory) BinaryTransformer(encoder binding.BinaryEncoder) binding.BinaryEncoder {
return &setExtensionTransformer{
BinaryEncoder: encoder,
name: a.name,
value: a.value,
found: false,
}
}
func (a setExtensionTranscoderFactory) EventTransformer() binding.EventTransformer {
return func(event *cloudevents.Event) error {
if _, ok := event.Extensions()[a.name]; !ok {
return event.Context.SetExtension(a.name, a.value)
}
return nil
}
}
type setAttributeTransformer struct {
binding.BinaryEncoder
attributeKind spec.Kind
value interface{}
version spec.Version
found bool
}
func (b *setAttributeTransformer) SetAttribute(attribute spec.Attribute, value interface{}) error {
if attribute.Kind() == b.attributeKind {
b.found = true
}
b.version = attribute.Version()
return b.BinaryEncoder.SetAttribute(attribute, value)
}
func (b *setAttributeTransformer) End() error {
if !b.found {
return b.BinaryEncoder.SetAttribute(b.version.AttributeFromKind(b.attributeKind), b.value)
}
return nil
}
type setExtensionTransformer struct {
binding.BinaryEncoder
name string
value interface{}
found bool
}
func (b *setExtensionTransformer) SetExtension(name string, value interface{}) error {
if name == b.name {
b.found = true
}
return b.BinaryEncoder.SetExtension(name, value)
}
func (b *setExtensionTransformer) End() error {
if !b.found {
return b.BinaryEncoder.SetExtension(b.name, b.value)
}
return nil
}