Some checks are pending
Docs Deploy / build_and_deploy (push) Waiting to run
Generate Docs / cli (push) Waiting to run
Generate Config Doc / cli (push) Waiting to run
Go formatting / go-formatting (push) Waiting to run
Check links / markdown-link-check (push) Waiting to run
Integration / pre-test (push) Waiting to run
Integration / test on (push) Blocked by required conditions
Integration / status (push) Blocked by required conditions
Lint / Lint Go code (push) Waiting to run
Test / test (ubuntu-latest) (push) Waiting to run
94 lines
2.2 KiB
Go
94 lines
2.2 KiB
Go
package xstrings
|
|
|
|
import (
|
|
"slices"
|
|
"strings"
|
|
"unicode"
|
|
|
|
"golang.org/x/text/cases"
|
|
"golang.org/x/text/language"
|
|
)
|
|
|
|
// AllOrSomeFilter filters elems out from the list as they present in filterList and
|
|
// returns the remaining ones.
|
|
// if filterList is empty, all elems from list returned.
|
|
func AllOrSomeFilter(list, filterList []string) []string {
|
|
if len(filterList) == 0 {
|
|
return list
|
|
}
|
|
|
|
var elems []string
|
|
|
|
for _, elem := range list {
|
|
if !slices.Contains(filterList, elem) {
|
|
elems = append(elems, elem)
|
|
}
|
|
}
|
|
|
|
return elems
|
|
}
|
|
|
|
// List returns a slice of strings captured after the value returned by do which is
|
|
// called n times.
|
|
func List(n int, do func(i int) string) []string {
|
|
var list []string
|
|
|
|
for i := 0; i < n; i++ {
|
|
list = append(list, do(i))
|
|
}
|
|
|
|
return list
|
|
}
|
|
|
|
// FormatUsername formats a username to make it usable as a variable.
|
|
func FormatUsername(s string) string {
|
|
return NoDash(NoNumberPrefix(s))
|
|
}
|
|
|
|
// NoDash removes dash from the string.
|
|
func NoDash(s string) string {
|
|
return strings.ReplaceAll(s, "-", "")
|
|
}
|
|
|
|
// NoNumberPrefix adds an underscore at the beginning of the string if it stars with a number
|
|
// this is used for package of proto files template because the package name can't start with a number.
|
|
func NoNumberPrefix(s string) string {
|
|
// Check if it starts with a digit
|
|
if unicode.IsDigit(rune(s[0])) {
|
|
return "_" + s
|
|
}
|
|
return s
|
|
}
|
|
|
|
// Title returns a copy of the string s with all Unicode letters that begin words
|
|
// mapped to their Unicode title case.
|
|
func Title(s string) string {
|
|
return cases.Title(language.English).String(s)
|
|
}
|
|
|
|
// ToUpperFirst returns a copy of the string with the first unicode letter in upper case.
|
|
func ToUpperFirst(s string) string {
|
|
return strings.ToUpper(s[:1]) + s[1:]
|
|
}
|
|
|
|
// StringBetween returns the string between two other strings.
|
|
// The comparison is not greedy so the between result includes the
|
|
// string between the start value and the first match of the end value.
|
|
func StringBetween(s, start, end string) string {
|
|
if s == "" || start == "" || end == "" {
|
|
return ""
|
|
}
|
|
|
|
i := strings.Index(s, start)
|
|
if i == -1 {
|
|
return ""
|
|
}
|
|
|
|
s = s[i+len(start):]
|
|
i = strings.Index(s, end)
|
|
if i == -1 {
|
|
return ""
|
|
}
|
|
|
|
return s[:i]
|
|
}
|