cronsun/event/event.go

99 lines
1.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package event
import (
"fmt"
"os"
"os/signal"
"reflect"
"syscall"
)
const (
EXIT = "exit"
WAIT = "wait"
)
var (
Events = make(map[string][]func(interface{}), 2)
)
func On(name string, fs ...func(interface{})) error {
evs, ok := Events[name]
if !ok {
evs = make([]func(interface{}), 0, len(fs))
}
for _, f := range fs {
if f == nil {
continue
}
fp := reflect.ValueOf(f).Pointer()
for i := 0; i < len(evs); i++ {
if reflect.ValueOf(evs[i]).Pointer() == fp {
return fmt.Errorf("func[%v] already exists in event[%s]", fp, name)
}
}
evs = append(evs, f)
}
Events[name] = evs
return nil
}
func Emit(name string, arg interface{}) {
evs, ok := Events[name]
if !ok {
return
}
for _, f := range evs {
f(arg)
}
}
func EmitAll(arg interface{}) {
for _, fs := range Events {
for _, f := range fs {
f(arg)
}
}
return
}
func Off(name string, f func(interface{})) error {
evs, ok := Events[name]
if !ok || len(evs) == 0 {
return fmt.Errorf("envet[%s] doesn't have any funcs", name)
}
fp := reflect.ValueOf(f).Pointer()
for i := 0; i < len(evs); i++ {
if reflect.ValueOf(evs[i]).Pointer() == fp {
evs = append(evs[:i], evs[i+1:]...)
Events[name] = evs
return nil
}
}
return fmt.Errorf("%v func dones't exist in event[%s]", fp, name)
}
func OffAll(name string) error {
Events[name] = nil
return nil
}
// 等待信号
// 如果信号参数为空,则会等待常见的终止信号
// SIGINT 2 A 键盘中断如break键被按下
// SIGTERM 15 A 终止信号
func Wait(sig ...os.Signal) os.Signal {
c := make(chan os.Signal, 1)
if len(sig) == 0 {
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
} else {
signal.Notify(c, sig...)
}
return <-c
}