package utils import ( "bytes" "os" "strconv" "strings" ) var MARKDOWN_ESC []string = []string{"_", "*", "[", "]", "(", ")", "~", "`", ">", "#", "+", "-", "=", "|", "{", "}", ".", "!"} func Contains[T comparable](slice []T, target T) bool { for _, v := range slice { if v == target { return true } } return false } func WriteMDv2Text(sb *strings.Builder, t string) { for _, c := range MARKDOWN_ESC { t = strings.Replace(t, c, "\\"+c, -1) } sb.WriteString(t) } func MDv2Text(t string) string { sb := strings.Builder{} for _, c := range MARKDOWN_ESC { t = strings.Replace(t, c, "\\"+c, -1) } sb.WriteString(t) return sb.String() } func IsASCIIAlnum(s string) bool { if s == "" { return false } for i := 0; i < len(s); i++ { c := s[i] if !(c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') { return false } } return true } func ToPower(t string) string { for s, r := range POWER_NUMBERS { t = strings.ReplaceAll(t, s, r) } return t } func ReadBOM(buff *bytes.Buffer) { b, _ := buff.ReadByte() if b != 0xef { buff.UnreadByte() return } b, _ = buff.ReadByte() if b != 0xbb { buff.UnreadByte() buff.UnreadByte() return } b, _ = buff.ReadByte() if b != 0xbf { buff.UnreadByte() buff.UnreadByte() buff.UnreadByte() } } func TryGetEnv[T any](name string, fallback T) T { v := os.Getenv(name) if v != "" { switch any(fallback).(type) { case uint64: p, err := strconv.ParseUint(v, 10, 64) if err == nil { return any(uint64(p)).(T) } case uint32: p, err := strconv.ParseUint(v, 10, 32) if err == nil { return any(uint32(p)).(T) } case int: p, err := strconv.ParseInt(v, 10, 32) if err == nil { return any(int(p)).(T) } case float64: p, err := strconv.ParseFloat(v, 64) if err == nil { return any(float64(p)).(T) } case float32: p, err := strconv.ParseFloat(v, 32) if err == nil { return any(float32(p)).(T) } default: return any(v).(T) } } return fallback }