Loading register/register.go 0 → 100644 +76 −0 Original line number Diff line number Diff line package register import ( "errors" "sync" ) // Connection contains connection related information. type Connection interface { Open(string) error Close() error } // Driver is an interface for drivers. type Driver interface { Open(string) (Connection, error) } const ( helixDriverName = "helix" radixDriverName = "radix" ) // Helix is an example driver. type Helix struct{} // Open implements the Driver interface. func (h *Helix) Open(dsn string) (Connection, error) { return nil, errors.New("not implemented yet") } // Radix is another example driver. type Radix struct{} // Open implements the Driver interface. func (r *Radix) Open(dsn string) (Connection, error) { return nil, errors.New("not implemented yet") } // Manager handles drivers. type Manager struct { driversMutex sync.RWMutex drivers map[string]Driver } // NewManager creates a new manager. func NewManager() *Manager { return &Manager{ drivers: make(map[string]Driver), } } // Register a driver. func (m *Manager) Register(name string, driver Driver) { m.driversMutex.Lock() defer m.driversMutex.Unlock() if driver == nil { panic("manager: driver is nil") } if _, dup := m.drivers[name]; dup { panic("manager: driver is already registred: " + name) } m.drivers[name] = driver } // Drivers lists registred drivers. func (m *Manager) Drivers() []string { drivers := []string{} for name := range m.drivers { drivers = append(drivers, name) } return drivers } register/register_test.go 0 → 100644 +30 −0 Original line number Diff line number Diff line package register import "testing" func TestRegister(t *testing.T) { m := NewManager() if l := len(m.Drivers()); l != 0 { t.Fatalf("number of drivers is %d, expected 0", l) } m.Register(helixDriverName, &Helix{}) ds := m.Drivers() if l := len(ds); l != 1 { t.Fatalf("number of drivers is %d, expected 1", l) } m.Register(radixDriverName, &Radix{}) ds = m.Drivers() if l := len(ds); l != 2 { t.Fatalf("number of drivers is %d, expected 1", 2) } for _, n := range ds { t.Logf("registred driver: %q", n) } } Loading
register/register.go 0 → 100644 +76 −0 Original line number Diff line number Diff line package register import ( "errors" "sync" ) // Connection contains connection related information. type Connection interface { Open(string) error Close() error } // Driver is an interface for drivers. type Driver interface { Open(string) (Connection, error) } const ( helixDriverName = "helix" radixDriverName = "radix" ) // Helix is an example driver. type Helix struct{} // Open implements the Driver interface. func (h *Helix) Open(dsn string) (Connection, error) { return nil, errors.New("not implemented yet") } // Radix is another example driver. type Radix struct{} // Open implements the Driver interface. func (r *Radix) Open(dsn string) (Connection, error) { return nil, errors.New("not implemented yet") } // Manager handles drivers. type Manager struct { driversMutex sync.RWMutex drivers map[string]Driver } // NewManager creates a new manager. func NewManager() *Manager { return &Manager{ drivers: make(map[string]Driver), } } // Register a driver. func (m *Manager) Register(name string, driver Driver) { m.driversMutex.Lock() defer m.driversMutex.Unlock() if driver == nil { panic("manager: driver is nil") } if _, dup := m.drivers[name]; dup { panic("manager: driver is already registred: " + name) } m.drivers[name] = driver } // Drivers lists registred drivers. func (m *Manager) Drivers() []string { drivers := []string{} for name := range m.drivers { drivers = append(drivers, name) } return drivers }
register/register_test.go 0 → 100644 +30 −0 Original line number Diff line number Diff line package register import "testing" func TestRegister(t *testing.T) { m := NewManager() if l := len(m.Drivers()); l != 0 { t.Fatalf("number of drivers is %d, expected 0", l) } m.Register(helixDriverName, &Helix{}) ds := m.Drivers() if l := len(ds); l != 1 { t.Fatalf("number of drivers is %d, expected 1", l) } m.Register(radixDriverName, &Radix{}) ds = m.Drivers() if l := len(ds); l != 2 { t.Fatalf("number of drivers is %d, expected 1", 2) } for _, n := range ds { t.Logf("registred driver: %q", n) } }