From 5c9783033816b8e3348e9cfc78e6c8411a81f0d2 Mon Sep 17 00:00:00 2001 From: imp2002 Date: Thu, 10 Nov 2022 20:53:35 +0800 Subject: [PATCH] feat!: expose error in NewAdapter() (#35) BREAKING CHANGE: expose error in `NewAdapter()` --- README.md | 6 +++--- adapter.go | 29 +++++++++++++++-------------- adapter_test.go | 6 +++--- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 6ca5de0..a66e3f2 100644 --- a/README.md +++ b/README.md @@ -18,13 +18,13 @@ import ( func main() { // Initialize a Redis adapter and use it in a Casbin enforcer: - a := redisadapter.NewAdapter("tcp", "127.0.0.1:6379") // Your Redis network and address. + a, _ := redisadapter.NewAdapter("tcp", "127.0.0.1:6379") // Your Redis network and address. // Use the following if Redis has password like "123" - //a := redisadapter.NewAdapterWithPassword("tcp", "127.0.0.1:6379", "123") + // a, err := redisadapter.NewAdapterWithPassword("tcp", "127.0.0.1:6379", "123") // Use the following if you use Redis with a specific user - // a := NewAdapterWithUser("tcp", "127.0.0.1:6379", "testaccount", "userpass") + // a, err := redisadapter.NewAdapterWithUser("tcp", "127.0.0.1:6379", "username", "password") e := casbin.NewEnforcer("examples/rbac_model.conf", a) diff --git a/adapter.go b/adapter.go index e63f2f7..98ad0a5 100644 --- a/adapter.go +++ b/adapter.go @@ -56,7 +56,7 @@ func finalizer(a *Adapter) { } func newAdapter(network string, address string, key string, - username string, password string) *Adapter { + username string, password string) (*Adapter, error) { a := &Adapter{} a.network = network a.address = address @@ -65,47 +65,47 @@ func newAdapter(network string, address string, key string, a.password = password // Open the DB, create it if not existed. - a.open() + err := a.open() // Call the destructor when the object is released. runtime.SetFinalizer(a, finalizer) - return a + return a, err } // NewAdapter is the constructor for Adapter. -func NewAdapter(network string, address string) *Adapter { +func NewAdapter(network string, address string) (*Adapter, error) { return newAdapter(network, address, "casbin_rules", "", "") } -func NewAdapterWithUser(network string, address string, username string, password string) *Adapter { +func NewAdapterWithUser(network string, address string, username string, password string) (*Adapter, error) { return newAdapter(network, address, "casbin_rules", username, password) } // NewAdapterWithPassword is the constructor for Adapter. -func NewAdapterWithPassword(network string, address string, password string) *Adapter { +func NewAdapterWithPassword(network string, address string, password string) (*Adapter, error) { return newAdapter(network, address, "casbin_rules", "", password) } // NewAdapterWithKey is the constructor for Adapter. -func NewAdapterWithKey(network string, address string, key string) *Adapter { +func NewAdapterWithKey(network string, address string, key string) (*Adapter, error) { return newAdapter(network, address, key, "", "") } type Option func(*Adapter) -func NewAdpaterWithOption(options ...Option) *Adapter { +func NewAdpaterWithOption(options ...Option) (*Adapter, error) { a := &Adapter{} for _, option := range options { option(a) } // Open the DB, create it if not existed. - a.open() + err := a.open() // Call the destructor when the object is released. runtime.SetFinalizer(a, finalizer) - return a + return a, err } func WithAddress(address string) Option { @@ -137,30 +137,31 @@ func WithKey(key string) Option { } } -func (a *Adapter) open() { +func (a *Adapter) open() error { //redis.Dial("tcp", "127.0.0.1:6379") if a.username != "" { conn, err := redis.Dial(a.network, a.address, redis.DialUsername(a.username), redis.DialPassword(a.password)) if err != nil { - panic(err) + return err } a.conn = conn } else if a.password == "" { conn, err := redis.Dial(a.network, a.address) if err != nil { - panic(err) + return err } a.conn = conn } else { conn, err := redis.Dial(a.network, a.address, redis.DialPassword(a.password)) if err != nil { - panic(err) + return err } a.conn = conn } + return nil } func (a *Adapter) close() { diff --git a/adapter_test.go b/adapter_test.go index fb4a392..d6adcad 100644 --- a/adapter_test.go +++ b/adapter_test.go @@ -353,13 +353,13 @@ func arrayEqualsWithoutOrder(a [][]string, b [][]string) bool { } func TestAdapters(t *testing.T) { - a := NewAdapter("tcp", "127.0.0.1:6379") + a, _ := NewAdapter("tcp", "127.0.0.1:6379") // Use the following if Redis has password like "123" - //a := NewAdapterWithPassword("tcp", "127.0.0.1:6379", "123") + //a, err := NewAdapterWithPassword("tcp", "127.0.0.1:6379", "123") // Use the following if you use Redis with a account - // a := NewAdapterWithUser("tcp", "127.0.0.1:6379", "testaccount", "userpass") + // a, err := NewAdapterWithUser("tcp", "127.0.0.1:6379", "testaccount", "userpass") testSaveLoad(t, a) testAutoSave(t, a)