github.com/go-email-validator/go-email-validator@v0.0.0-20230409163946-b8b9e6a0552e/pkg/ev/evsmtp/smtp_cache.go (about) 1 package evsmtp 2 3 import ( 4 "fmt" 5 "github.com/go-email-validator/go-email-validator/pkg/ev/evcache" 6 "github.com/go-email-validator/go-email-validator/pkg/ev/evmail" 7 "github.com/go-email-validator/go-email-validator/pkg/log" 8 "go.uber.org/zap" 9 ) 10 11 // ARandomRCPT is abstract realization of RandomRCPT 12 type ARandomRCPT struct { 13 fn RandomRCPTFunc 14 } 15 16 // Call is calling of RandomRCPTFunc 17 func (a *ARandomRCPT) Call(sm SendMail, email evmail.Address) []error { 18 return a.fn(sm, email) 19 } 20 21 func (a *ARandomRCPT) set(fn RandomRCPTFunc) { 22 a.fn = fn 23 } 24 25 func (a *ARandomRCPT) get() RandomRCPTFunc { 26 return a.fn 27 } 28 29 // RandomCacheKeyGetter is type of function to get cache key 30 type RandomCacheKeyGetter func(email evmail.Address) interface{} 31 32 // DefaultRandomCacheKeyGetter generates of cache key for RandomRCPT 33 func DefaultRandomCacheKeyGetter(email evmail.Address) interface{} { 34 return email.Domain() 35 } 36 37 // NewCheckerCacheRandomRCPT creates Checker with caching of RandomRCPT calling 38 func NewCheckerCacheRandomRCPT(checker CheckerWithRandomRCPT, cache evcache.Interface, getKey RandomCacheKeyGetter) Checker { 39 if getKey == nil { 40 getKey = DefaultRandomCacheKeyGetter 41 } 42 43 c := &checkerCacheRandomRCPT{ 44 CheckerWithRandomRCPT: checker, 45 randomRCPT: &ARandomRCPT{fn: checker.get()}, 46 cache: cache, 47 getKey: getKey, 48 } 49 50 c.CheckerWithRandomRCPT.set(c.RandomRCPT) 51 52 return c 53 } 54 55 type checkerCacheRandomRCPT struct { 56 CheckerWithRandomRCPT 57 randomRCPT RandomRCPT 58 cache evcache.Interface 59 getKey RandomCacheKeyGetter 60 } 61 62 func (c checkerCacheRandomRCPT) RandomRCPT(sm SendMail, email evmail.Address) (errs []error) { 63 key := c.getKey(email) 64 resultInterface, err := c.cache.Get(key) 65 if err == nil && resultInterface != nil { 66 errs = *resultInterface.(*[]error) 67 } else { 68 errs = c.randomRCPT.Call(sm, email) 69 if err = c.cache.Set(key, ErrorsToEVSMTPErrors(errs)); err != nil { 70 log.Logger().Error(fmt.Sprintf("cache RandomRCPT: %s", err), 71 zap.String("email", email.String()), 72 zap.String("key", fmt.Sprint(key)), 73 ) 74 } 75 } 76 77 return errs 78 }