-
Notifications
You must be signed in to change notification settings - Fork 0
/
register.go
66 lines (58 loc) · 1.72 KB
/
register.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
package gta
import (
"fmt"
"sync"
)
const (
varchar64MaxLenth = 64
)
type taskRegister interface {
Register(key TaskKey, def TaskDefinition) error
GetDefinition(key TaskKey) (*TaskDefinition, error)
GroupKeysByInitTimeoutSensitivity() ([]TaskKey, []TaskKey)
GetBuiltInKeys() []TaskKey
}
type taskRegisterImp struct {
defMap sync.Map
}
func (s *taskRegisterImp) Register(key TaskKey, def TaskDefinition) error {
if len([]rune(key)) > varchar64MaxLenth {
return fmt.Errorf("task_key exceed max length: %v", key)
}
if err := def.init(key); err != nil {
return fmt.Errorf("definition validate error: %w, task_key: %v", err, key)
}
if _, loaded := s.defMap.LoadOrStore(def.key, &def); loaded {
return fmt.Errorf("definition already registered, task_key: %v", def.key)
}
return nil
}
func (s *taskRegisterImp) GetDefinition(key TaskKey) (*TaskDefinition, error) {
value, ok := s.defMap.Load(key)
if !ok {
return nil, fmt.Errorf("definition not found, task_key: %v", key)
}
return value.(*TaskDefinition), nil
}
func (s *taskRegisterImp) GroupKeysByInitTimeoutSensitivity() ([]TaskKey, []TaskKey) {
sensitiveKeys, insensitiveKeys := make([]TaskKey, 0), make([]TaskKey, 0)
s.defMap.Range(func(key, value interface{}) bool {
if def := value.(*TaskDefinition); def.InitTimeoutSensitive {
sensitiveKeys = append(sensitiveKeys, key.(TaskKey))
} else {
insensitiveKeys = append(insensitiveKeys, key.(TaskKey))
}
return true
})
return sensitiveKeys, insensitiveKeys
}
func (s *taskRegisterImp) GetBuiltInKeys() []TaskKey {
res := make([]TaskKey, 0)
s.defMap.Range(func(key, value interface{}) bool {
if def := value.(*TaskDefinition); def.builtin {
res = append(res, key.(TaskKey))
}
return true
})
return res
}