-
Notifications
You must be signed in to change notification settings - Fork 4
/
metadata.go
63 lines (51 loc) · 1.53 KB
/
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
package cel
import (
"context"
"github.com/google/cel-go/cel"
"github.com/google/cel-go/common/types"
"github.com/google/cel-go/common/types/ref"
"google.golang.org/grpc/metadata"
)
const MetadataPackageName = "metadata"
func NewMetadataLibrary() *MetadataLibrary {
return &MetadataLibrary{}
}
type MetadataLibrary struct {
ctx context.Context
}
func (lib *MetadataLibrary) LibraryName() string {
return packageName(MetadataPackageName)
}
func (lib *MetadataLibrary) Initialize(ctx context.Context) {
lib.ctx = ctx
}
func createMetadata(name string) string {
return createName(MetadataPackageName, name)
}
func createMetadataID(name string) string {
return createID(MetadataPackageName, name)
}
func (lib *MetadataLibrary) CompileOptions() []cel.EnvOption {
opts := []cel.EnvOption{
cel.Function(
createMetadata("incoming"),
cel.Overload(createMetadataID("incoming_map_string_list_string"), []*cel.Type{}, types.NewMapType(types.StringType, types.NewListType(types.StringType)),
cel.FunctionBinding(func(_ ...ref.Val) ref.Val {
refMap := make(map[ref.Val]ref.Val)
md, ok := metadata.FromIncomingContext(lib.ctx)
if !ok {
return types.NewRefValMap(types.DefaultTypeAdapter, refMap)
}
for k, vs := range md {
refMap[types.String(k)] = types.NewStringList(types.DefaultTypeAdapter, vs)
}
return types.NewRefValMap(types.DefaultTypeAdapter, refMap)
}),
),
),
}
return opts
}
func (lib *MetadataLibrary) ProgramOptions() []cel.ProgramOption {
return []cel.ProgramOption{}
}