package langext import ( "fmt" "strings" "unicode" ) func StrLimit(val string, maxlen int, suffix string) string { if len(val) > maxlen { return val[0:maxlen-len(suffix)] + suffix } return val } func StrSplit(val string, sep string, allowEmpty bool) []string { var arr []string for k := range strings.SplitSeq(val, sep) { if allowEmpty || k != "" { arr = append(arr, k) } } return arr } func StrPadRight(str string, pad string, padlen int) string { if pad == "" { pad = " " } if len(str) >= padlen { return str } return str + strings.Repeat(pad, padlen-len(str))[0:(padlen-len(str))] } func StrPadLeft(str string, pad string, padlen int) string { if pad == "" { pad = " " } if len(str) >= padlen { return str } return strings.Repeat(pad, padlen-len(str))[0:(padlen-len(str))] + str } func DeRefStringer(v fmt.Stringer) *string { if v == nil { return nil } else { return new(v.String()) } } func ConvertStringerArray[T fmt.Stringer](inarr []T) []string { result := make([]string, 0, len(inarr)) for _, v := range inarr { result = append(result, v.String()) } return result } func StrRunePadLeft(str string, pad string, padlen int) string { if pad == "" { pad = " " } if len([]rune(str)) >= padlen { return str } return strings.Repeat(pad, padlen-len([]rune(str)))[0:(padlen-len([]rune(str)))] + str } func StrRunePadRight(str string, pad string, padlen int) string { if pad == "" { pad = " " } if len([]rune(str)) >= padlen { return str } return str + strings.Repeat(pad, padlen-len([]rune(str)))[0:(padlen-len([]rune(str)))] } func Indent(str string, pad string) string { eonl := strings.HasSuffix(str, "\n") if eonl { str = str[0 : len(str)-1] } r := "" for v := range strings.SplitSeq(str, "\n") { r += pad + v + "\n" } if !eonl { r = r[0 : len(r)-1] } return r } func NumToStringOpt[V IntConstraint](v *V, fallback string) string { if v == nil { return fallback } else { return fmt.Sprintf("%d", v) } } func StrRepeat(val string, count int) string { var r strings.Builder for range count { r.WriteString(val) } return r.String() } func StrWrap(val string, linelen int, seperator string) string { var res strings.Builder for iPos := 0; ; { next := min(iPos+linelen, len(val)) res.WriteString(val[iPos:next]) iPos = next if iPos >= len(val) { break } res.WriteString(seperator) } return res.String() } func StrRemoveControlCharacters(str string) string { return strings.Map(func(r rune) rune { if unicode.IsControl(r) { return -1 } return r }, str) }