src.dualinventive.com/go/devsim/daemon/simulator_client.go

134 lines
3.6 KiB
Go

package daemon
import (
"context"
"fmt"
"src.dualinventive.com/go/devsim"
"src.dualinventive.com/go/devsim/simulator"
)
type simulatorClient struct {
c devsim.SimulatorServiceClient
}
var _ simulator.Service = &simulatorClient{}
type simulatorClientInfo struct {
rep *devsim.SimulatorInfo
}
var _ simulator.Info = &simulatorClientInfo{}
func (sci *simulatorClientInfo) DeviceUID() string {
return sci.rep.DeviceUID
}
func (sci *simulatorClientInfo) Author() string {
return sci.rep.Author
}
func (sci *simulatorClientInfo) Version() string {
return sci.rep.Version
}
func (sci *simulatorClientInfo) Path() string {
return ""
}
func (sci *simulatorClientInfo) Key() string {
return sci.rep.Key
}
func (sci *simulatorClientInfo) Name() string {
return sci.rep.Name
}
type simulatorClientObj struct {
simulator.Info
deviceUID string
c *simulatorClient
}
func (sco *simulatorClientObj) Start() error {
return sco.c.Start(sco.DeviceUID())
}
func (sco *simulatorClientObj) Stop() error {
return sco.c.Stop(sco.DeviceUID())
}
// List return the current managed simulators
func (sc *simulatorClient) List() []simulator.Simulator {
simList, err := sc.list("")
if err != nil {
return nil
}
return simList
}
func (sc *simulatorClient) list(deviceUID string) ([]simulator.Simulator, error) {
infoC, err := sc.c.Info(context.TODO(), &devsim.SimulatorRequest{DeviceUID: deviceUID})
if err != nil {
return nil, err
}
var simList []simulator.Simulator
for {
rep, err := infoC.Recv()
if err != nil {
break
}
sim := &simulatorClientObj{Info: &simulatorClientInfo{rep: rep}, deviceUID: rep.DeviceUID, c: sc}
simList = append(simList, sim)
}
return simList, nil
}
// Add adds a new simulator in the list of managed simulators. The simulator is prepared to start, but is
// not started yet.
func (sc *simulatorClient) Add(uri string, version string) (simulator.Info, error) {
rep, err := sc.c.Create(context.TODO(), &devsim.SimulatorCreateRequest{Uri: uri, Version: version})
if err != nil {
return nil, err
}
return &simulatorClientInfo{rep: &devsim.SimulatorInfo{DeviceUID: rep.DeviceUID}}, err
}
// Get returns the simulator with the given deviceUID or an ErrNotFound it returned when the simulator is
// not found.
func (sc *simulatorClient) Get(deviceUID string) (simulator.Simulator, error) {
simList, err := sc.list(deviceUID)
if err != nil {
return nil, err
}
if len(simList) == 0 {
return nil, fmt.Errorf("not found")
}
return simList[0], nil
}
// Remove removes the simulator of the list of managed simulators. This simulator must be stopped in order
// to succeeds. An ErrNotFound is returned when the simulator is not found. An ErrNotStopped is returned when the
// simulator is still running.
func (sc *simulatorClient) Remove(deviceUID string) error {
_, err := sc.c.Remove(context.TODO(), &devsim.SimulatorRequest{DeviceUID: deviceUID})
return err
}
// Start starts the simulator with the given deviceUID. An ErrNotFound is returned when the simulator is
// not found. An ErrAlreadyRunning is returned when the simulator is already running.
func (sc *simulatorClient) Start(deviceUID string) error {
_, err := sc.c.Start(context.TODO(), &devsim.SimulatorRequest{DeviceUID: deviceUID})
return err
}
// Stop stops the simulator with the given deviceUID. An ErrNotFound is returned when the simulator is
// not found. An ErrAlreadyStopped is returned when the simulator is already stopped.
func (sc *simulatorClient) Stop(deviceUID string) error {
_, err := sc.c.Stop(context.TODO(), &devsim.SimulatorRequest{DeviceUID: deviceUID})
return err
}