Newer
Older
package cmd
import (
"fmt"
"orus.io/xbus/xbus-stdlib/service"
"xbus.io/go-xbus/v4"
"xbus.io/go-xbus/v4/api"
)
type XbusOptions struct {
Config string `long:"config-file" ini-name:"config-file" description:"xbus client configuration file"`
}
func SetupXbusCmd[E any](program *Program[E]) *XbusCmd {
cmd := XbusCmd{}
c, err := program.Parser.AddCommand("xbus", "Standalone xbus client", "", &cmd)
if err != nil {
panic(err)
}
SetupXbusServeCmd(program, c)
return &cmd
}
type XbusCmd struct{}
func (p *Program[E]) xbusClientOptions() (xbus.COptions, error) {
if p.XbusOptions.Config == "" {
return xbus.COptions{}, fmt.Errorf("%w: missing xbus.config-file", ErrInvalidConfiguration)
}
coptions, err := xbus.COptionsFromFile(p.XbusOptions.Config, api.Account_ACTOR, p.Logger)
// TODO allow the program user to make verifications on the configuration
return coptions, err
}
func (p *Program[E]) xbusRegisterActors() error {
for _, factory := range p.setupXbusActors(p) {
switch f := factory.Factory.(type) {
case service.ConsumerFactory:
if err := service.RegisterConsumer(factory.Name, f); err != nil {
return err
}
case service.ConsumerFunc:
if err := service.RegisterConsumerFunc(factory.Name, f); err != nil {
return err
}
case service.WorkerFactory:
if err := service.RegisterWorker(factory.Name, f); err != nil {
return err
}
case service.WorkerFunc:
if err := service.RegisterWorkerFunc(factory.Name, f); err != nil {
return err
}
case xbus.NewActorServiceFunc:
xbus.RegisterActorService(factory.Name, f)
default:
return fmt.Errorf("%s has an factory type: %t", factory.Name, factory.Factory)
}
p.xbusActorNames = append(p.xbusActorNames, factory.Name)
}
return nil
}
func (p *Program[E]) xbusUnregisterActors() {
for _, n := range p.xbusActorNames {
xbus.UnregisterActorService(n)
}
p.xbusActorNames = nil
}