src.dualinventive.com/go/devsim/simulator/driver.go

62 lines
1.4 KiB
Go

package simulator
import (
"fmt"
"sync"
)
var (
driversMu sync.RWMutex
drivers = make(map[string]Driver)
)
// Driver creates new simulators
type Driver interface {
// Name gets the name of the driver
Name() string
// New creates a new simulator
New(m Model, info Info) (Simulator, error)
// Valid checks if the template information contains enough data to start the simulator
Valid(info Info) bool
}
// Drivers returns a sorted list of the names of the registered drivers.
func Drivers() []Driver {
var list []Driver
driversMu.RLock()
defer driversMu.RUnlock()
for _, driver := range drivers {
list = append(list, driver)
}
return list
}
// Register makes the simulator available by the provided name.
// If Register is called twice with the same name or if driver is nil,
// it panics
func Register(name string, driver Driver) {
driversMu.Lock()
defer driversMu.Unlock()
if driver == nil {
panic("simulator: Register driver is nil")
}
if _, dup := drivers[name]; dup {
panic("simulator: Register is called twice for driver " + name)
}
drivers[name] = driver
}
// NewSimulator creates a new simulator specified by its simulator driver name
func NewSimulator(driverName string, m Model, info Info) (Simulator, error) {
driversMu.RLock()
driveri, ok := drivers[driverName]
driversMu.RUnlock()
if !ok {
return nil, fmt.Errorf("simulator: unknown driver %q (forgotten import?)", driverName)
}
return driveri.New(m, info)
}