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 }