-
Notifications
You must be signed in to change notification settings - Fork 0
/
naming.go
58 lines (49 loc) · 1.25 KB
/
naming.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package camelcase
import (
"strings"
"unicode"
"golang.org/x/text/cases"
"golang.org/x/text/language"
)
var (
LowerSnakeCase = makeCase("_", wrap(strings.ToLower))
UpperSnakeCase = makeCase("_", wrap(strings.ToUpper))
LowerKebabCase = makeCase("-", wrap(strings.ToLower))
UpperKebabCase = makeCase("-", wrap(strings.ToUpper))
LowerCamelCase = makeCase("", func(w string, i int) string {
if i == 0 {
return strings.ToLower(w)
}
return cases.Title(language.Und).String(w)
})
UpperCamelCase = makeCase("", func(w string, i int) string {
return cases.Title(language.Und).String(w)
})
)
func wrap(transWord func(w string) string) func(w string, i int) string {
return func(w string, i int) string {
return transWord(w)
}
}
func makeCase(linker string, transWord func(w string, i int) string) func(s string) string {
return func(s string) string {
words := Split(s)
var b strings.Builder
idx := 0
for _, word := range words {
if len(word) == 1 && unicode.IsGraphic(rune(word[0])) {
c := rune(word[0])
if !(unicode.IsDigit(c) || unicode.IsLetter(c)) {
// only number or letter
continue
}
}
if idx > 0 {
b.WriteString(linker)
}
b.WriteString(transWord(word, idx))
idx++
}
return b.String()
}
}