github.com/naoina/kocha@v0.7.1-0.20171129072645-78c7a531f799/event.go (about)

     1  package kocha
     2  
     3  import (
     4  	"os"
     5  	"reflect"
     6  	"strconv"
     7  
     8  	"github.com/naoina/kocha/event"
     9  )
    10  
    11  // EventHandlerMap represents a map of event handlers.
    12  type EventHandlerMap map[event.Queue]map[string]func(app *Application, args ...interface{}) error
    13  
    14  // Evevnt represents the event.
    15  type Event struct {
    16  	// HandlerMap is a map of queue/handlers.
    17  	HandlerMap EventHandlerMap
    18  
    19  	// WorkersPerQueue is a number of workers per queue.
    20  	// The default value is taken from GOMAXPROCS.
    21  	// If value of GOMAXPROCS is invalid, set to 1.
    22  	WorkersPerQueue int
    23  
    24  	// ErrorHandler is the handler for error.
    25  	// If you want to use your own error handler, please set to ErrorHandler.
    26  	ErrorHandler func(err interface{})
    27  
    28  	e   *event.Event
    29  	app *Application
    30  }
    31  
    32  // Trigger emits the event.
    33  // The name is an event name that is defined in e.HandlerMap.
    34  // If args given, they will be passed to event handler that is defined in e.HandlerMap.
    35  func (e *Event) Trigger(name string, args ...interface{}) error {
    36  	return e.e.Trigger(name, args...)
    37  }
    38  
    39  func (e *Event) addHandler(name string, queueName string, handler func(app *Application, args ...interface{}) error) error {
    40  	return e.e.AddHandler(name, queueName, func(args ...interface{}) error {
    41  		return handler(e.app, args...)
    42  	})
    43  }
    44  
    45  func (e *Event) build(app *Application) (*Event, error) {
    46  	if e == nil {
    47  		e = &Event{}
    48  	}
    49  	e.e = event.New()
    50  	for queue, handlerMap := range e.HandlerMap {
    51  		queueName := reflect.TypeOf(queue).String()
    52  		if err := e.e.RegisterQueue(queueName, queue); err != nil {
    53  			return nil, err
    54  		}
    55  		for name, handler := range handlerMap {
    56  			if err := e.addHandler(name, queueName, handler); err != nil {
    57  				return nil, err
    58  			}
    59  		}
    60  	}
    61  	n := e.WorkersPerQueue
    62  	if n < 1 {
    63  		if n, _ = strconv.Atoi(os.Getenv("GOMAXPROCS")); n < 1 {
    64  			n = 1
    65  		}
    66  	}
    67  	e.e.SetWorkersPerQueue(n)
    68  	e.e.ErrorHandler = e.ErrorHandler
    69  	return e, nil
    70  }
    71  
    72  func (e *Event) start() {
    73  	e.e.Start()
    74  }
    75  
    76  func (e *Event) stop() {
    77  	e.e.Stop()
    78  }