Make NewManager actually create a new provider #1

Merged
lunny merged 2 commits from zeripath/session:new-manager-new-provider into master 2021-09-13 06:47:32 +00:00

View File

@ -23,6 +23,7 @@ import (
"fmt"
"net/http"
"net/url"
"reflect"
"time"
)
@ -291,17 +292,34 @@ type Provider interface {
GC()
}
var providers = make(map[string]Provider)
var providers = make(map[string]func() Provider)
// Register registers a provider.
func Register(name string, provider Provider) {
if provider == nil {
if reflect.TypeOf(provider).Kind() == reflect.Ptr {
// Pointer:
RegisterFn(name, func() Provider {
return reflect.New(reflect.ValueOf(provider).Elem().Type()).Interface().(Provider)
})
return
}
// Not a Pointer
RegisterFn(name, func() Provider {
return reflect.New(reflect.TypeOf(provider)).Elem().Interface().(Provider)
})
}
// RegisterFn registers a provider function.
func RegisterFn(name string, providerfn func() Provider) {
if providerfn == nil {
panic("session: cannot register provider with nil value")
}
if _, dup := providers[name]; dup {
panic(fmt.Errorf("session: cannot register provider '%s' twice", name))
}
providers[name] = provider
providers[name] = providerfn
}
lunny marked this conversation as resolved Outdated
Outdated
Review

I think storing the value as a function to create provider is better.

I think storing the value as a function to create provider is better.
// _____
@ -318,12 +336,15 @@ type Manager struct {
}
// NewManager creates and returns a new session manager by given provider name and configuration.
// It panics when given provider isn't registered.
// It returns an error when requested provider name isn't registered.
func NewManager(name string, opt Options) (*Manager, error) {
p, ok := providers[name]
fn, ok := providers[name]
if !ok {
return nil, fmt.Errorf("session: unknown provider '%s'(forgotten import?)", name)
}
p := fn()
return &Manager{p, opt}, p.Init(opt.Maxlifetime, opt.ProviderConfig)
}