package internal func IsUpper(c byte) bool { return c >= 'A' && c <= 'Z' } func IsLower(c byte) bool { return c >= 'a' && c <= 'z' } func ToUpper(c byte) byte { return c - 32 } func ToLower(c byte) byte { return c + 32 } // Underscore converts "CamelCasedString" to "camel_cased_string". func Underscore(s string) string { r := make([]byte, 0, len(s)+5) for i := 0; i < len(s); i++ { c := s[i] if IsUpper(c) { if i > 0 && i+1 < len(s) && (IsLower(s[i-1]) || IsLower(s[i+1])) { r = append(r, '_', ToLower(c)) } else { r = append(r, ToLower(c)) } } else { r = append(r, c) } } return string(r) } func CamelCased(s string) string { r := make([]byte, 0, len(s)) upperNext := true for i := 0; i < len(s); i++ { c := s[i] if c == '_' { upperNext = true continue } if upperNext { if IsLower(c) { c = ToUpper(c) } upperNext = false } r = append(r, c) } return string(r) } func ToExported(s string) string { if len(s) == 0 { return s } if c := s[0]; IsLower(c) { b := []byte(s) b[0] = ToUpper(c) return string(b) } return s }