-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcommand_management.go
More file actions
129 lines (112 loc) · 5.69 KB
/
Copy pathcommand_management.go
File metadata and controls
129 lines (112 loc) · 5.69 KB
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package vkc
import "fmt"
// Добавляет обработчик в конец списка.
//
// Возвращает индекс добавленного обработчика.
//
// Если обработчик был nil, возвращает ошибку.
//
// `Предупреждение!` Метод не потокобезопасный. Пользуйтесь внешними примитивами синхронизации. Будет исправлено в версии v2.
func (commands *Commands[DEPS]) Register(handler *CommandHandler[DEPS]) (int, error) {
commands.cmdMutex.Lock()
defer commands.cmdMutex.Unlock()
if handler == nil {
return -1, fmt.Errorf("nil handler")
}
commands.Handlers = append(commands.Handlers, handler)
return len(commands.Handlers) - 1, nil
}
// Удаляет первое вхождение обработчика.
//
// Если обработчик не найден, возвращает ошибку.
// Также возвращает ошибку, если передан nil вместо обработчика.
//
// `Предупреждение!` Метод не потокобезопасный. Пользуйтесь внешними примитивами синхронизации. Будет исправлено в версии v2.
func (commands *Commands[DEPS]) Unregister(handler *CommandHandler[DEPS]) error {
commands.cmdMutex.Lock()
defer commands.cmdMutex.Unlock()
if handler == nil {
return fmt.Errorf("nil handler")
}
for i, h := range commands.Handlers {
if h == handler {
commands.Handlers = append(commands.Handlers[:i], commands.Handlers[i+1:]...)
return nil
}
}
return fmt.Errorf("handler not found")
}
// Удаляет обработчик по индексу.
//
// Если индекс выходит за пределы внутреннего среза, возвращает ошибку.
//
// `Предупреждение!` Метод не потокобезопасный. Пользуйтесь внешними примитивами синхронизации. Будет исправлено в версии v2.
func (commands *Commands[DEPS]) UnregisterAt(index int) error {
commands.cmdMutex.Lock()
defer commands.cmdMutex.Unlock()
if index < 0 || index >= len(commands.Handlers) {
return fmt.Errorf("index out of range")
}
commands.Handlers = append(commands.Handlers[:index], commands.Handlers[index+1:]...)
return nil
}
// Заменяет обработчик по индексу.
//
// Если индекс выходит за пределы внутреннего среза, возвращает ошибку.
// Также возвращает ошибку, если передан nil вместо обработчика.
//
// `Предупреждение!` Метод не потокобезопасный. Пользуйтесь внешними примитивами синхронизации. Будет исправлено в версии v2.
func (commands *Commands[DEPS]) Replace(index int, handler *CommandHandler[DEPS]) error {
commands.cmdMutex.Lock()
defer commands.cmdMutex.Unlock()
if handler == nil {
return fmt.Errorf("nil handler")
}
if index < 0 || index >= len(commands.Handlers) {
return fmt.Errorf("index out of range")
}
commands.Handlers[index] = handler
return nil
}
// Ищет обработчик во внутреннем срезе и возвращает его индекс.
// Если обработчик не найден, возвращает -1.
//
// `Предупреждение!` Метод не потокобезопасный. Пользуйтесь внешними примитивами синхронизации. Будет исправлено в версии v2.
func (commands *Commands[DEPS]) FindHandlerIndex(handler *CommandHandler[DEPS]) int {
commands.cmdMutex.RLock()
defer commands.cmdMutex.RUnlock()
for i, h := range commands.Handlers {
if h == handler {
return i
}
}
return -1
}
// Возвращает количество зарегистрированных обработчиков.
//
// `Предупреждение!` Метод не потокобезопасный. Пользуйтесь внешними примитивами синхронизации. Будет исправлено в версии v2.
func (commands *Commands[DEPS]) HandlersCount() int {
commands.cmdMutex.RLock()
defer commands.cmdMutex.RUnlock()
return len(commands.Handlers)
}
// Возвращает копию среза обработчиков.
//
// Изменение возвращённого среза не повлияет на внутреннее состояние Commands.
//
// `Предупреждение!` Метод не потокобезопасный. Пользуйтесь внешними примитивами синхронизации. Будет исправлено в версии v2.
func (commands *Commands[DEPS]) GetHandlers() []*CommandHandler[DEPS] {
commands.cmdMutex.RLock()
defer commands.cmdMutex.RUnlock()
out := make([]*CommandHandler[DEPS], len(commands.Handlers))
copy(out, commands.Handlers)
return out
}
// Устанавливает список обработчиков в пустой срез.
//
// `Предупреждение!` Метод не потокобезопасный. Пользуйтесь внешними примитивами синхронизации. Будет исправлено в версии v2.
func (commands *Commands[DEPS]) ClearHandlers() {
commands.cmdMutex.Lock()
defer commands.cmdMutex.Unlock()
commands.Handlers = make([]*CommandHandler[DEPS], 0)
}