mirror of
https://github.com/grafana/loki.git
synced 2026-03-13 09:33:58 +08:00
68 lines
1.4 KiB
Go
68 lines
1.4 KiB
Go
package util //nolint:revive
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"sort"
|
|
"unicode"
|
|
)
|
|
|
|
func StringRef(value string) *string {
|
|
return &value
|
|
}
|
|
|
|
// SnakeCase converts given string `s` into `snake_case`.
|
|
func SnakeCase(s string) string {
|
|
var buf bytes.Buffer
|
|
for i, r := range s {
|
|
if unicode.IsUpper(r) && i > 0 && s[i-1] != '_' {
|
|
fmt.Fprintf(&buf, "_")
|
|
}
|
|
r = unicode.ToLower(r)
|
|
fmt.Fprintf(&buf, "%c", r)
|
|
}
|
|
return buf.String()
|
|
}
|
|
|
|
// StringsContain returns true if the search value is within the list of input values.
|
|
func StringsContain(values []string, search string) bool {
|
|
for _, v := range values {
|
|
if search == v {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// UniqueStrings keeps a slice of unique strings.
|
|
type UniqueStrings struct {
|
|
values map[string]struct{}
|
|
result []string
|
|
}
|
|
|
|
// NewUniqueStrings returns a UniqueStrings instance with a pre-allocated result buffer.
|
|
func NewUniqueStrings(sizeHint int) UniqueStrings {
|
|
return UniqueStrings{result: make([]string, 0, sizeHint)}
|
|
}
|
|
|
|
// Add adds a new string, dropping duplicates.
|
|
func (us *UniqueStrings) Add(strings ...string) {
|
|
for _, s := range strings {
|
|
if _, ok := us.values[s]; ok {
|
|
continue
|
|
}
|
|
if us.values == nil {
|
|
us.values = map[string]struct{}{}
|
|
}
|
|
us.values[s] = struct{}{}
|
|
us.result = append(us.result, s)
|
|
}
|
|
}
|
|
|
|
// Strings returns the sorted sliced of unique strings.
|
|
func (us UniqueStrings) Strings() []string {
|
|
sort.Strings(us.result)
|
|
return us.result
|
|
}
|