gonews/eventer/exported.go

67 lines
1.7 KiB
Go

package eventer
import (
// stdlib
"log"
)
var (
// List of known event handler.
// Format:
// - commands/CMDNAME - base handler for command. This what
// networker will execute on any new command. Case-insensitive.
// - internals/CMDNAME - all other internal things like database
// access.
// This map will not be changed after gonewsd initialization is
// complete.
events map[string]*EventHandler
// Flag that indicates that we have completed events mapping
// initialization.
// RWMutex can be here, but we also need to write to log if we have
// completed initialization.
eventsInitialized bool
)
// Initialize initializes package.
func Initialize() {
log.Println("Initializing event handler...")
events = make(map[string]*EventHandler)
}
// InitializeCompleted sets eventsInitialized bool to true to avoid
// all further events mapping changes.
func InitializeCompleted() {
eventsInitialized = true
log.Println("Events initialization completed")
}
// AddEventHandler adds event handler to a list of known handlers.
func AddEventHandler(event *EventHandler) {
if !eventsInitialized {
events[event.Command] = event
} else {
log.Println("Can't add event '" + event.Command + "' to a list of known events - events mapping initialization already completed, no more changes allowed.")
}
}
// LaunchEvent launches desired event in synchronous manner.
func LaunchEvent(eventName string, data interface{}) (interface{}, error) {
handler, exists := events[eventName]
if !exists {
return nil, ErrEventNotFound
}
returnedData := handler.Handler(data)
return returnedData, nil
}
// Shutdown just nullifies eventer map.
// Useful for testing and, maybe, reload.
func Shutdown() {
events = nil
eventsInitialized = false
}