-
Notifications
You must be signed in to change notification settings - Fork 5
/
value.go
86 lines (67 loc) · 2.13 KB
/
value.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
// Copyright (c) 2020 SDSLabs
// Use of this source code is governed by an MIT license
// details of which can be found in the LICENSE file.
package kiwi
import "fmt"
// Errors related to values.
var (
ErrValueRegistered = fmt.Errorf("value already registered")
ErrValueNotRegistered = fmt.Errorf("value not registered")
)
// newValueErr creates a new error with related value type.
func newValueErr(err error, typ ValueType) error {
return fmt.Errorf("%w: %v", err, typ)
}
// Errors related to actions.
var (
ErrInvalidAction = fmt.Errorf("invalid action")
)
// valueMap maintains all the values registered with the library.
var valueMap = map[ValueType]func() Value{}
type (
// ValueType is the name of type of value.
ValueType string
// Action is required to invoke (or "Do") an action.
Action string
// DoFunc is a function that can be executed when an action is invoked.
DoFunc func(params ...interface{}) (interface{}, error)
)
// Value is something that can be associated with a "key".
//
// A value implements its own methods and can be accessed by type assertion.
// To add a value type to the register simply call RegisterValue.
// All the default values are already registered with the package.
type Value interface {
// Type returns the type of the value.
Type() ValueType
// DoMap returns a map which associates actions with a do function.
DoMap() map[Action]DoFunc
}
// RegisterValue registers a new value type with the package.
//
// It takes in two params: the type of the value and a function to create a new value.
func RegisterValue(newFn func() Value) {
typ := newFn().Type()
if _, ok := valueMap[typ]; ok {
panic(newValueErr(ErrValueRegistered, typ))
}
valueMap[typ] = newFn
}
// ListRegisteredValues lists all the values registered with the package.
func ListRegisteredValues() []string {
vals := make([]string, len(valueMap))
i := 0
for key := range valueMap {
vals[i] = string(key)
i++
}
return vals
}
// newValue creates a value from it's type.
func newValue(typ ValueType) (Value, error) {
nf, ok := valueMap[typ]
if !ok {
return nil, newValueErr(ErrValueNotRegistered, typ)
}
return nf(), nil
}