62 lines
1.4 KiB
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)
|
|
}
|