File: registry.go

package info (click to toggle)
gitlab-ci-multi-runner 14.10.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 31,248 kB
  • sloc: sh: 1,694; makefile: 384; asm: 79; ruby: 68
file content (92 lines) | stat: -rw-r--r-- 2,106 bytes parent folder | download
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
package registry

import (
	"fmt"
)

type FactoryAlreadyRegisteredError struct {
	factoryType string
	factoryName string
}

func NewFactoryAlreadyRegisteredError(factoryType string, factoryName string) *FactoryAlreadyRegisteredError {
	return &FactoryAlreadyRegisteredError{
		factoryType: factoryType,
		factoryName: factoryName,
	}
}

func (e *FactoryAlreadyRegisteredError) Error() string {
	return fmt.Sprintf("factory for %s %q already registered", e.factoryType, e.factoryName)
}

func (e *FactoryAlreadyRegisteredError) Is(err error) bool {
	eerr, ok := err.(*FactoryAlreadyRegisteredError)
	if !ok {
		return false
	}

	return eerr.factoryName == e.factoryName
}

type FactoryNotRegisteredError struct {
	factoryType string
	factoryName string
}

func NewFactoryNotRegisteredError(factoryType string, factoryName string) *FactoryNotRegisteredError {
	return &FactoryNotRegisteredError{
		factoryType: factoryType,
		factoryName: factoryName,
	}
}

func (e *FactoryNotRegisteredError) Error() string {
	return fmt.Sprintf("factory for %s %q is not registered", e.factoryType, e.factoryName)
}

func (e *FactoryNotRegisteredError) Is(err error) bool {
	eerr, ok := err.(*FactoryNotRegisteredError)
	if !ok {
		return false
	}

	return eerr.factoryName == e.factoryName
}

type Registry interface {
	Register(factoryName string, factory interface{}) error
	Get(factoryName string) (interface{}, error)
}

type factoryRegistry struct {
	factoryType string
	store       map[string]interface{}
}

func (r factoryRegistry) Register(factoryName string, factory interface{}) error {
	_, ok := r.store[factoryName]
	if ok {
		return NewFactoryAlreadyRegisteredError(r.factoryType, factoryName)
	}

	r.store[factoryName] = factory

	return nil
}

func (r factoryRegistry) Get(factoryName string) (interface{}, error) {
	factory, ok := r.store[factoryName]
	if !ok {
		return nil, NewFactoryNotRegisteredError(r.factoryType, factoryName)
	}

	return factory, nil
}

func New(factoryType string) Registry {
	return &factoryRegistry{
		factoryType: factoryType,
		store:       make(map[string]interface{}),
	}
}