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) }