package cache import ( "context" "fmt" "net/url" ) type option struct { ctx context.Context redis *string memory bool } type Option func(*option) func WithCtx(ctx context.Context) Option { return func(c *option) { if ctx != nil { c.ctx = ctx } } } func WithRedis(host string, port int, username, password string) Option { return func(c *option) { uri := fmt.Sprintf("redis://%s:%d", host, port) if username != "" || password != "" { uri = fmt.Sprintf("redis://%s:%s@%s:%d", username, password, host, port) } c.redis = &uri } } func WithRedisURI(uri string) Option { return func(c *option) { ins, err := url.Parse(uri) if err != nil { return } if ins.Scheme != "redis" { return } c.redis = &uri } } func WithMemory() Option { return func(c *option) { c.memory = true } }