master
go 85 lines 1.77 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package sd
4
5 import (
6 "encoding/json"
7 "slices"
8
9 "github.com/netdata/netdata/go/plugins/plugin/agent/discovery/sd/model"
10 )
11
12 type Descriptor struct {
13 Type string
14 Schema string
15 ParseJSONConfig func(raw json.RawMessage) (any, error)
16 NewDiscoverers func(cfg any, source string) ([]model.Discoverer, error)
17 }
18
19 type Registry interface {
20 Types() []string
21 Get(typ string) (Descriptor, bool)
22 }
23
24 type mapRegistry struct {
25 types []string
26 desc map[string]Descriptor
27 }
28
29 func NewRegistry(descriptors ...Descriptor) Registry {
30 reg := &mapRegistry{
31 types: make([]string, 0, len(descriptors)),
32 desc: make(map[string]Descriptor, len(descriptors)),
33 }
34 for _, d := range descriptors {
35 if d.Type == "" {
36 continue
37 }
38 if _, ok := reg.desc[d.Type]; !ok {
39 reg.types = append(reg.types, d.Type)
40 }
41 reg.desc[d.Type] = d
42 }
43 return reg
44 }
45
46 func (r *mapRegistry) Types() []string {
47 return slices.Clone(r.types)
48 }
49
50 func (r *mapRegistry) Get(typ string) (Descriptor, bool) {
51 d, ok := r.desc[typ]
52 return d, ok
53 }
54
55 func NewDescriptor[T any](
56 typ, schema string,
57 parseJSON func(raw json.RawMessage) (T, error),
58 newDiscs func(cfg T, source string) ([]model.Discoverer, error),
59 ) Descriptor {
60 return Descriptor{
61 Type: typ,
62 Schema: schema,
63 ParseJSONConfig: func(raw json.RawMessage) (any, error) {
64 return parseJSON(raw)
65 },
66 NewDiscoverers: func(cfg any, source string) ([]model.Discoverer, error) {
67 v, ok := cfg.(T)
68 if !ok {
69 var z T
70 return nil, &typedConfigError{typ: typ, got: cfg, want: z}
71 }
72 return newDiscs(v, source)
73 },
74 }
75 }
76
77 type typedConfigError struct {
78 typ string
79 got any
80 want any
81 }
82
83 func (e *typedConfigError) Error() string {
84 return "discoverer '" + e.typ + "': invalid parsed config type"
85 }