forked from sensu/sensu-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
node.go
77 lines (63 loc) · 2.1 KB
/
node.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
package relay
import (
"context"
"github.com/sirupsen/logrus"
"github.com/sensu/sensu-go/backend/apid/graphql/globalid"
"github.com/sensu/sensu-go/graphql"
)
// A NodeResolver describes an object that contains a globally unique ID.
type NodeResolver struct {
ObjectType graphql.Type
Translator globalid.Translator
Resolve func(NodeResolverParams) (interface{}, error)
IsKindOf func(globalid.Components) bool
}
// NodeResolverParams parameters to given to resolve method
type NodeResolverParams struct {
// Context ...
Context context.Context
// IDComponents is the individual components of the given global ID
IDComponents globalid.Components
// Info is a collection of information about the current execution state.
Info graphql.ResolveInfo
}
// NodeRegister stores list of node resolvers
type NodeRegister map[string][]NodeResolver
// RegisterResolver registers a new node resolver and adds it to the register
func (register NodeRegister) RegisterResolver(resolver NodeResolver) {
translatorName := resolver.Translator.ForResourceNamed()
entry := register[translatorName]
entry = append(entry, resolver)
if len(entry) > 1 && entry[0].IsKindOf == nil && entry[1].IsKindOf == nil {
logEntry := logger.WithFields(logrus.Fields{
"globalid": translatorName,
})
logEntry.Panic(
"Failed to register resolver because you already have one resolver " +
"registered to this globalid. If you do intend to register more than " +
"on resolver you must set the IsKindOf field, so that the Register " +
"can properly route fetches.",
)
}
register[translatorName] = entry
}
// Lookup given parsed globalid return valid resolver.
func (register NodeRegister) Lookup(components globalid.Components) *NodeResolver {
entries := register[components.Resource()]
entriesLen := len(entries)
logEntry := logger.WithFields(logrus.Fields{
"entriesLen": entriesLen,
"idComponents": components,
})
logEntry.Debug("lookup")
if entriesLen > 1 {
for _, entry := range entries {
if entry.IsKindOf(components) {
return &entry
}
}
} else if entriesLen == 1 {
return &entries[0]
}
return nil
}