-
Notifications
You must be signed in to change notification settings - Fork 0
/
type_provider.go
96 lines (80 loc) · 2.43 KB
/
type_provider.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
package xcel
import (
"github.com/google/cel-go/common/types"
"github.com/google/cel-go/common/types/ref"
)
var _ types.Provider = &TypeProvider{}
type TypeProvider struct {
Idents map[string]ref.Val
Types map[string]*types.Type
Stucts map[string]map[string]*types.FieldType
StructFieldTypes map[string]map[string]*types.FieldType
}
func NewTypeProvider() *TypeProvider {
return &TypeProvider{
Idents: map[string]ref.Val{},
Types: map[string]*types.Type{},
Stucts: map[string]map[string]*types.FieldType{},
StructFieldTypes: map[string]map[string]*types.FieldType{},
}
}
func (TypeProvider) EnumValue(enumName string) ref.Val {
return types.NewErr("not implemented")
}
func (tp *TypeProvider) FindIdent(identName string) (ref.Val, bool) {
if v, ok := tp.Idents[identName]; ok {
return v, true
}
return nil, false
}
func (tp *TypeProvider) FindStructType(structType string) (*types.Type, bool) {
if t, ok := tp.Types[structType]; ok {
return t, true
}
return nil, false
}
func (tp *TypeProvider) FindStructFieldNames(structType string) ([]string, bool) {
if structType == "Example" {
return []string{
"name",
}, true
}
if t, ok := tp.Stucts[structType]; ok {
var names []string
for name := range t {
names = append(names, name)
}
return names, true
}
return nil, false
}
func (tp *TypeProvider) FindStructFieldType(messageType, fieldName string) (*types.FieldType, bool) {
if t, ok := tp.StructFieldTypes[messageType]; ok {
if ft, ok := t[fieldName]; ok {
return ft, true
}
}
return nil, false
}
func (TypeProvider) NewValue(typeName string, fields map[string]ref.Val) ref.Val {
return types.NewErr("not implemented")
}
var DefaultTypeProvider = &TypeProvider{
Idents: map[string]ref.Val{},
Types: map[string]*types.Type{},
Stucts: map[string]map[string]*types.FieldType{},
StructFieldTypes: map[string]map[string]*types.FieldType{},
}
func RegisterIdent(tp *TypeProvider, name string, value ref.Val) {
tp.Idents[name] = value
}
func RegisterType(tp *TypeProvider, t *types.Type) {
tp.Types[t.TypeName()] = t
}
func RegisterStructType(tp *TypeProvider, name string, fields map[string]*types.FieldType) {
tp.Stucts[name] = fields
registerStructFieldType(tp, name, fields)
}
func registerStructFieldType(tp *TypeProvider, name string, fields map[string]*types.FieldType) {
tp.StructFieldTypes[name] = fields
}