48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
package redis
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/go-redis/redis/v8"
|
|
"github.com/mitchellh/mapstructure"
|
|
|
|
"code.1533b4dc0.de/prskr/nurse/config"
|
|
"code.1533b4dc0.de/prskr/nurse/grammar"
|
|
)
|
|
|
|
//nolint:ireturn // no other choice
|
|
func clientFromParam(p grammar.Param, srvLookup config.ServerLookup) (redis.UniversalClient, error) {
|
|
if srvName, err := p.AsString(); err != nil {
|
|
return nil, err
|
|
} else if srv, err := srvLookup.Lookup(srvName); err != nil {
|
|
return nil, err
|
|
} else if redisCli, err := ClientForServer(srv); err != nil {
|
|
return nil, err
|
|
} else {
|
|
return redisCli, nil
|
|
}
|
|
}
|
|
|
|
//nolint:ireturn // no other choice
|
|
func ClientForServer(srv *config.Server) (redis.UniversalClient, error) {
|
|
opts := &redis.UniversalOptions{
|
|
Addrs: srv.Hosts,
|
|
}
|
|
|
|
if pathLen := len(srv.Path); pathLen > 0 {
|
|
if db, err := strconv.Atoi(srv.Path[0]); err == nil {
|
|
opts.DB = db
|
|
}
|
|
}
|
|
|
|
if err := mapstructure.Decode(srv.Args, opts); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if srv.Credentials != nil {
|
|
opts.Username = srv.Credentials.Username
|
|
opts.Password = *srv.Credentials.Password
|
|
}
|
|
|
|
return redis.NewUniversalClient(opts), nil
|
|
}
|