blob: e2fe960bfadd26f8e3aba5d950ddcabf9efae8c5 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package fidlgen
import (
"strings"
"unicode"
"unicode/utf8"
)
// Break a name into parts, discarding underscores but not changing case
func nameParts(name string) []string {
var parts []string
for _, namePart := range strings.Split(name, "_") {
partStart := 0
lastRune, _ := utf8.DecodeRuneInString(namePart)
lastRuneStart := 0
for i, curRune := range namePart {
if i == 0 {
continue
}
if unicode.IsUpper(curRune) && !unicode.IsUpper(lastRune) {
parts = append(parts, namePart[partStart:i])
partStart = i
}
if !(unicode.IsUpper(curRune) || unicode.IsDigit(curRune)) && unicode.IsUpper(lastRune) && partStart != lastRuneStart {
parts = append(parts, namePart[partStart:lastRuneStart])
partStart = lastRuneStart
}
lastRuneStart = i
lastRune = curRune
}
parts = append(parts, namePart[partStart:])
}
return parts
}
// Convert text to snake_case style
func ToSnakeCase(name string) string {
parts := nameParts(name)
for i := range parts {
parts[i] = strings.ToLower(parts[i])
}
return strings.Join(parts, "_")
}
// Convert a name to UpperCamelCase style
func ToUpperCamelCase(name string) string {
parts := nameParts(name)
for i := range parts {
parts[i] = strings.Title(strings.ToLower(parts[i]))
if parts[i] == "" {
parts[i] = "_"
}
}
return strings.Join(parts, "")
}
// Convert a name to lowerCamelCase style
func ToLowerCamelCase(name string) string {
parts := nameParts(name)
for i := range parts {
if i == 0 {
parts[i] = strings.ToLower(parts[i])
} else {
parts[i] = strings.Title(strings.ToLower(parts[i]))
}
if parts[i] == "" {
parts[i] = "_"
}
}
return strings.Join(parts, "")
}
// Convert text to friendly case style (like snake case, but with spaces)
func ToFriendlyCase(name string) string {
parts := nameParts(name)
for i := range parts {
parts[i] = strings.ToLower(parts[i])
}
return strings.Join(parts, " ")
}
// Convert a const name from kCamelCase to ALL_CAPS_SNAKE style
func ConstNameToAllCapsSnake(name string) string {
parts := nameParts(RemoveLeadingK(name))
for i := range parts {
parts[i] = strings.ToUpper(parts[i])
}
return strings.Join(parts, "_")
}
// Removes a leading 'k' if the second character is upper-case, otherwise
// returns the argument
func RemoveLeadingK(name string) string {
if len(name) >= 2 && name[0] == 'k' {
secondRune, _ := utf8.DecodeRuneInString(name[1:])
if unicode.IsUpper(secondRune) {
name = name[1:]
}
}
return name
}