2022-04-28 16:35:02 +00:00
|
|
|
package redis
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
|
|
|
|
"github.com/go-redis/redis/v8"
|
2022-05-08 09:00:22 +00:00
|
|
|
|
|
|
|
"github.com/baez90/nurse/grammar"
|
2022-06-09 15:20:06 +00:00
|
|
|
"github.com/baez90/nurse/validation"
|
2022-04-28 16:35:02 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
2022-06-09 15:20:06 +00:00
|
|
|
_ CmdValidator = (*GenericCmdValidator)(nil)
|
2022-05-08 09:00:22 +00:00
|
|
|
|
2022-06-09 20:12:45 +00:00
|
|
|
registry = validation.NewRegistry[redis.Cmder]()
|
2022-04-28 16:35:02 +00:00
|
|
|
)
|
|
|
|
|
2022-06-09 20:12:45 +00:00
|
|
|
func init() {
|
|
|
|
registry.Register("equals", func() validation.FromCall[redis.Cmder] {
|
|
|
|
return new(GenericCmdValidator)
|
|
|
|
})
|
2022-05-08 09:00:22 +00:00
|
|
|
}
|
|
|
|
|
2022-06-09 20:12:45 +00:00
|
|
|
type CmdValidator interface {
|
|
|
|
Validate(cmder redis.Cmder) error
|
2022-04-28 16:35:02 +00:00
|
|
|
}
|
|
|
|
|
2022-06-09 15:20:06 +00:00
|
|
|
func GenericCommandValidatorFor[T validation.Value](want T) (*GenericCmdValidator, error) {
|
|
|
|
comparator, err := validation.JSONValueComparatorFor(want)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return &GenericCmdValidator{
|
|
|
|
comparator: comparator,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type GenericCmdValidator struct {
|
|
|
|
comparator validation.ValueComparator
|
|
|
|
}
|
2022-04-28 16:35:02 +00:00
|
|
|
|
2022-06-09 15:20:06 +00:00
|
|
|
func (g *GenericCmdValidator) UnmarshalCall(c grammar.Call) error {
|
2022-05-08 09:00:22 +00:00
|
|
|
if err := grammar.ValidateParameterCount(c.Params, 1); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2022-06-09 15:20:06 +00:00
|
|
|
var err error
|
|
|
|
switch c.Params[0].Type() {
|
|
|
|
case grammar.ParamTypeInt:
|
|
|
|
if g.comparator, err = validation.JSONValueComparatorFor(*c.Params[0].Int); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
case grammar.ParamTypeFloat:
|
|
|
|
if g.comparator, err = validation.JSONValueComparatorFor(*c.Params[0].Float); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
case grammar.ParamTypeString:
|
|
|
|
if g.comparator, err = validation.JSONValueComparatorFor(*c.Params[0].String); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2022-06-09 20:40:32 +00:00
|
|
|
case grammar.ParamTypeUnknown:
|
|
|
|
fallthrough
|
2022-06-09 15:20:06 +00:00
|
|
|
default:
|
2022-06-09 20:12:45 +00:00
|
|
|
return errors.New("param type is unknown")
|
2022-05-08 09:00:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2022-06-09 20:12:45 +00:00
|
|
|
func (g *GenericCmdValidator) Validate(cmder redis.Cmder) error {
|
2022-04-28 16:35:02 +00:00
|
|
|
if err := cmder.Err(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2022-06-09 20:40:32 +00:00
|
|
|
if in, ok := cmder.(*redis.StringCmd); ok {
|
2022-06-09 15:20:06 +00:00
|
|
|
res, err := in.Result()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2022-06-09 20:12:45 +00:00
|
|
|
return g.comparator.Equals(res)
|
2022-04-28 16:35:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|