This repository has been archived by the owner on Nov 3, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 11
/
decorator_cache.go
66 lines (56 loc) 路 1.89 KB
/
decorator_cache.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package ev
import (
"fmt"
"github.com/go-email-validator/go-email-validator/pkg/ev/evcache"
"github.com/go-email-validator/go-email-validator/pkg/ev/utils"
"github.com/go-email-validator/go-email-validator/pkg/log"
"go.uber.org/zap"
)
// CacheKeyGetter is type for key generators
// To use complex keys you can use https://github.com/vmihailenco/msgpack/
type CacheKeyGetter func(input Input, results ...ValidationResult) interface{}
// EmailCacheKeyGetter generates key as full email
func EmailCacheKeyGetter(input Input, _ ...ValidationResult) interface{} {
return input.Email().String()
}
// DomainCacheKeyGetter generates key as domain
func DomainCacheKeyGetter(input Input, _ ...ValidationResult) interface{} {
return input.Email().Domain()
}
// NewCacheDecorator instantiates cache decorator
func NewCacheDecorator(validator Validator, cache evcache.Interface, getKey CacheKeyGetter) Validator {
if getKey == nil {
getKey = EmailCacheKeyGetter
}
return &cacheDecorator{
validator: validator,
cache: cache,
getKey: getKey,
}
}
type cacheDecorator struct {
validator Validator
cache evcache.Interface
getKey CacheKeyGetter
}
func (c *cacheDecorator) GetDeps() []ValidatorName {
return c.validator.GetDeps()
}
func (c *cacheDecorator) Validate(input Input, results ...ValidationResult) (result ValidationResult) {
key := c.getKey(input, results...)
resultInterface, err := c.cache.Get(key)
if err == nil && resultInterface != nil {
result = *resultInterface.(*ValidationResult)
} else {
result = c.validator.Validate(input, results...)
if err := c.cache.Set(key, result); err != nil {
log.Logger().Error(fmt.Sprintf("cache decorator %v", err),
zap.String("validator", utils.StructName(c.validator)),
zap.String("key", fmt.Sprint(key)),
zap.String("email", input.Email().String()),
zap.String("results", fmt.Sprint(results)),
)
}
}
return result
}