mirror of https://github.com/docker/cli.git
50 lines
1.2 KiB
Go
50 lines
1.2 KiB
Go
package system
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
eventtypes "github.com/docker/docker/api/types/events"
|
|
)
|
|
|
|
type eventProcessor func(eventtypes.Message, error) error
|
|
|
|
// EventHandler is abstract interface for user to customize
|
|
// own handle functions of each type of events
|
|
type EventHandler interface {
|
|
Handle(action string, h func(eventtypes.Message))
|
|
Watch(c <-chan eventtypes.Message)
|
|
}
|
|
|
|
// InitEventHandler initializes and returns an EventHandler
|
|
func InitEventHandler() EventHandler {
|
|
return &eventHandler{handlers: make(map[string]func(eventtypes.Message))}
|
|
}
|
|
|
|
type eventHandler struct {
|
|
handlers map[string]func(eventtypes.Message)
|
|
mu sync.Mutex
|
|
}
|
|
|
|
func (w *eventHandler) Handle(action string, h func(eventtypes.Message)) {
|
|
w.mu.Lock()
|
|
w.handlers[action] = h
|
|
w.mu.Unlock()
|
|
}
|
|
|
|
// Watch ranges over the passed in event chan and processes the events based on the
|
|
// handlers created for a given action.
|
|
// To stop watching, close the event chan.
|
|
func (w *eventHandler) Watch(c <-chan eventtypes.Message) {
|
|
for e := range c {
|
|
w.mu.Lock()
|
|
h, exists := w.handlers[e.Action]
|
|
w.mu.Unlock()
|
|
if !exists {
|
|
continue
|
|
}
|
|
logrus.Debugf("event handler: received event: %v", e)
|
|
go h(e)
|
|
}
|
|
}
|