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  }