mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
0640a14b4f
Using gomvpkg -from github.com/docker/docker/api/client -to github.com/docker/docker/cli/command -vcs_mv_cmd 'git mv {{.Src}} {{.Dst}}' Signed-off-by: Daniel Nephin <dnephin@docker.com>
66 lines
1.5 KiB
Go
66 lines
1.5 KiB
Go
package system
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"sync"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
eventtypes "github.com/docker/docker/api/types/events"
|
|
)
|
|
|
|
// 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)
|
|
}
|
|
}
|
|
|
|
// DecodeEvents decodes event from input stream
|
|
func DecodeEvents(input io.Reader, ep eventProcessor) error {
|
|
dec := json.NewDecoder(input)
|
|
for {
|
|
var event eventtypes.Message
|
|
err := dec.Decode(&event)
|
|
if err != nil && err == io.EOF {
|
|
break
|
|
}
|
|
|
|
if procErr := ep(event, err); procErr != nil {
|
|
return procErr
|
|
}
|
|
}
|
|
return nil
|
|
}
|