Commit f0c2913b authored by Boris Mühmer's avatar Boris Mühmer
Browse files

added a plugin register pattern adopted from the database sql interface

parent 02a2872d
Loading
Loading
Loading
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
}
+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)
	}
}