You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
775 B
48 lines
775 B
package lucifer3
|
|
|
|
import (
|
|
"sync/atomic"
|
|
)
|
|
|
|
type Service interface {
|
|
Active() bool
|
|
HandleEvent(bus *EventBus, event Event)
|
|
}
|
|
|
|
type ActiveService interface {
|
|
Service
|
|
|
|
HandleCommand(bus *EventBus, command Command)
|
|
}
|
|
|
|
type ServiceCommon struct {
|
|
inactive uint32
|
|
}
|
|
|
|
func (s *ServiceCommon) Active() bool {
|
|
return atomic.LoadUint32(&s.inactive) == 0
|
|
}
|
|
|
|
func (s *ServiceCommon) markInactive() {
|
|
atomic.StoreUint32(&s.inactive, 1)
|
|
}
|
|
|
|
type callbackService struct {
|
|
ServiceCommon
|
|
cb func(event Event) bool
|
|
}
|
|
|
|
func (c *callbackService) HandleEvent(_ *EventBus, event Event) {
|
|
if !c.cb(event) {
|
|
c.markInactive()
|
|
}
|
|
}
|
|
|
|
func newCallbackService(cb func(event Event) bool) Service {
|
|
return &callbackService{
|
|
ServiceCommon: ServiceCommon{
|
|
inactive: 0,
|
|
},
|
|
cb: cb,
|
|
}
|
|
}
|