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 }