github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/util/string.go (about)

     1  package util
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"sort"
     7  	"unicode"
     8  )
     9  
    10  func StringRef(value string) *string {
    11  	return &value
    12  }
    13  
    14  // SnakeCase converts given string `s` into `snake_case`.
    15  func SnakeCase(s string) string {
    16  	var buf bytes.Buffer
    17  	for i, r := range s {
    18  		if unicode.IsUpper(r) && i > 0 && s[i-1] != '_' {
    19  			fmt.Fprintf(&buf, "_")
    20  		}
    21  		r = unicode.ToLower(r)
    22  		fmt.Fprintf(&buf, "%c", r)
    23  	}
    24  	return buf.String()
    25  }
    26  
    27  // StringsContain returns true if the search value is within the list of input values.
    28  func StringsContain(values []string, search string) bool {
    29  	for _, v := range values {
    30  		if search == v {
    31  			return true
    32  		}
    33  	}
    34  
    35  	return false
    36  }
    37  
    38  // UniqueStrings keeps a slice of unique strings.
    39  type UniqueStrings struct {
    40  	values map[string]struct{}
    41  	result []string
    42  }
    43  
    44  // NewUniqueStrings returns a UniqueStrings instance with a pre-allocated result buffer.
    45  func NewUniqueStrings(sizeHint int) UniqueStrings {
    46  	return UniqueStrings{result: make([]string, 0, sizeHint)}
    47  }
    48  
    49  // Add adds a new string, dropping duplicates.
    50  func (us *UniqueStrings) Add(strings ...string) {
    51  	for _, s := range strings {
    52  		if _, ok := us.values[s]; ok {
    53  			continue
    54  		}
    55  		if us.values == nil {
    56  			us.values = map[string]struct{}{}
    57  		}
    58  		us.values[s] = struct{}{}
    59  		us.result = append(us.result, s)
    60  	}
    61  }
    62  
    63  // Strings returns the sorted sliced of unique strings.
    64  func (us UniqueStrings) Strings() []string {
    65  	sort.Strings(us.result)
    66  	return us.result
    67  }