github.com/go-email-validator/go-email-validator@v0.0.0-20230409163946-b8b9e6a0552e/pkg/ev/contains/in_strings.go (about)

     1  package contains
     2  
     3  import "github.com/emirpasic/gods/sets/hashset"
     4  
     5  // InStrings checks existing value in set of strings
     6  type InStrings interface {
     7  	Contains(value string) bool
     8  }
     9  
    10  // NewInStringsFromArray instantiates InStrings based on []string
    11  func NewInStringsFromArray(elements []string) InStrings {
    12  	var maxLen = 0
    13  	setElements := make([]interface{}, len(elements))
    14  	for i, element := range elements {
    15  		currentLen := len(element)
    16  		if currentLen > maxLen {
    17  			maxLen = currentLen
    18  		}
    19  		setElements[i] = element
    20  	}
    21  
    22  	return NewInStrings(NewSet(hashset.New(setElements...)), maxLen)
    23  }
    24  
    25  // NewInStrings instantiates InStrings based on InSet
    26  func NewInStrings(contains InSet, maxLen int) InStrings {
    27  	return inStrings{contains, maxLen}
    28  }
    29  
    30  type inStrings struct {
    31  	contains InSet
    32  	maxLen   int
    33  }
    34  
    35  func (is inStrings) Contains(value string) bool {
    36  	var maxLen = len(value)
    37  	var jEnd int
    38  
    39  	for i := 0; i < maxLen; i++ {
    40  		key := ""
    41  		jEnd = i + is.maxLen
    42  		if jEnd > maxLen {
    43  			jEnd = maxLen
    44  		}
    45  		for j := i; j < jEnd; j++ {
    46  			key += string(value[j])
    47  			if is.contains.Contains(key) {
    48  				return true
    49  			}
    50  		}
    51  	}
    52  
    53  	return false
    54  }