Skip to content

Commit 309867d

Browse files
committed
Make SplitJoin public
1 parent de65840 commit 309867d

File tree

1 file changed

+35
-24
lines changed

1 file changed

+35
-24
lines changed

strcase/id.go

+35-24
Original file line numberDiff line numberDiff line change
@@ -6,49 +6,43 @@ import (
66
"unicode"
77
)
88

9+
type CaseStrategy int
10+
11+
const (
12+
CaseStrategyAlways CaseStrategy = 0
13+
CaseStrategySkipFirstPart CaseStrategy = 1
14+
CaseStrategyNever CaseStrategy = math.MaxInt64
15+
16+
NoSeparator rune = 0
17+
)
18+
919
// ToPascalCase transforms a string in any form to PascalCase.
1020
func ToPascalCase(input string) string {
11-
return splitJoin(input, 0, 0, false)
21+
return SplitJoin(input, CaseStrategyAlways, NoSeparator, false)
1222
}
1323

1424
// ToPascalGoCase transforms a string in any form to PascalCase, but with recognized initialisms in uppercase, matching the Go style.
1525
func ToPascalGoCase(input string) string {
16-
return splitJoin(input, 0, 0, true)
26+
return SplitJoin(input, CaseStrategyAlways, NoSeparator, true)
1727
}
1828

1929
// ToCamelCase transforms a string in any form to camelCase.
2030
func ToCamelCase(input string) string {
21-
return splitJoin(input, 1, 0, false)
31+
return SplitJoin(input, CaseStrategySkipFirstPart, NoSeparator, false)
2232
}
2333

2434
// ToCamelGoCase transforms a string in any form to camelCase, but with recognized initialisms in uppercase, matching the Go style.
2535
func ToCamelGoCase(input string) string {
26-
return splitJoin(input, 1, 0, true)
36+
return SplitJoin(input, CaseStrategySkipFirstPart, NoSeparator, true)
2737
}
2838

2939
// ToSnakeCase transforms a string in any form to snake_case.
3040
func ToSnakeCase(input string) string {
31-
return splitJoin(input, math.MaxInt64, '_', false)
41+
return SplitJoin(input, CaseStrategyNever, '_', false)
3242
}
3343

34-
func allocateBuilder(input string, separator rune) *strings.Builder {
35-
var b strings.Builder
36-
length := len(input)
37-
if separator != 0 {
38-
// Heuristic to add about 25% buffer for separators
39-
// Not having perfect match isn't terrible, it will only result in a few more memory allocations.
40-
// Ex:
41-
// foo_bar_baz: 9 original chars, 11 final. 9 * 5 / 4 = 11
42-
// foo_id: 5 original chars, 6 final. 5 * 5 / 4 = 6
43-
// a_b_c_d: 4 original chars, 7 final. 4 * 5 / 4 = 5, which will result in an extra allocation.
44-
length = length * 5 / 4
45-
}
46-
47-
b.Grow(length)
48-
return &b
49-
}
50-
51-
func splitJoin(input string, firstUpper int, separator rune, initialism bool) string {
44+
func SplitJoin(input string, caseStrategy CaseStrategy, separator rune, initialism bool) string {
45+
firstUpper := int(caseStrategy)
5246
b := allocateBuilder(input, separator)
5347
var buf []rune
5448
var currentPartIndex int
@@ -60,7 +54,7 @@ func splitJoin(input string, firstUpper int, separator rune, initialism bool) st
6054
// Nothing was added since last flush
6155
return
6256
}
63-
if separator != 0 && currentPartIndex > 0 {
57+
if separator != NoSeparator && currentPartIndex > 0 {
6458
b.WriteRune(separator)
6559
}
6660
if currentPartIndex >= firstUpper {
@@ -98,6 +92,23 @@ func splitJoin(input string, firstUpper int, separator rune, initialism bool) st
9892
return b.String()
9993
}
10094

95+
func allocateBuilder(input string, separator rune) *strings.Builder {
96+
var b strings.Builder
97+
length := len(input)
98+
if separator != NoSeparator {
99+
// Heuristic to add about 25% buffer for separators
100+
// Not having perfect match isn't terrible, it will only result in a few more memory allocations.
101+
// Ex:
102+
// foo_bar_baz: 9 original chars, 11 final. 9 * 5 / 4 = 11
103+
// foo_id: 5 original chars, 6 final. 5 * 5 / 4 = 6
104+
// a_b_c_d: 4 original chars, 7 final. 4 * 5 / 4 = 5, which will result in an extra allocation.
105+
length = length * 5 / 4
106+
}
107+
108+
b.Grow(length)
109+
return &b
110+
}
111+
101112
// Convert to uppercase if initialism and `initialism` is true.
102113
// Convert first rune to uppercase otherwise.
103114
func pascalPart(part []rune, initialism bool) {

0 commit comments

Comments
 (0)