55 lines
746 B
Go
55 lines
746 B
Go
package bus
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
)
|
|
|
|
var (
|
|
Stop = make(map[string]Messenger)
|
|
mu = &sync.RWMutex{}
|
|
)
|
|
|
|
type Messenger interface {
|
|
Send(any)
|
|
Recv() any
|
|
}
|
|
|
|
type Route struct {
|
|
msg chan any
|
|
}
|
|
|
|
func (r Route) Send(a any) {
|
|
select {
|
|
case r.msg <- a:
|
|
//
|
|
}
|
|
}
|
|
|
|
func (r Route) Recv() any {
|
|
select {
|
|
case in := <-r.msg:
|
|
return in
|
|
}
|
|
}
|
|
|
|
func NewMessenger(name string) error {
|
|
mu.Lock()
|
|
defer mu.Unlock()
|
|
if _, ok := Stop[name]; ok {
|
|
return errors.New(name + " already exists")
|
|
}
|
|
|
|
Stop[name] = &Route{msg: make(chan any)}
|
|
return nil
|
|
}
|
|
|
|
func GetMessenger(name string) (Messenger, error) {
|
|
mu.RLock()
|
|
defer mu.RUnlock()
|
|
if _, ok := Stop[name]; !ok {
|
|
return nil, errors.New(name + " doesn't exist")
|
|
}
|
|
return Stop[name], nil
|
|
}
|