1 package data
2 3 // The following code is a modified copy of functions found in strcase, found here: https://github.com/iancoleman/strcase
4 5 import (
6 "bytes"
7 "regexp"
8 "strings"
9 "unicode"
10 )
11 12 // ToCamel converts a string to CamelCase
13 func ToCamel(s string) string {
14 s = addWordBoundariesToNumbers(s)
15 s = strings.TrimSpace(s)
16 b := bytes.NewBuffer(make([]byte, 0))
17 c := true
18 for _, v := range s {
19 if v >= 'A' && v <= 'Z' {
20 b.WriteString(string(v))
21 }
22 if v >= '0' && v <= '9' {
23 b.WriteString(string(v))
24 }
25 if v >= 'a' && v <= 'z' {
26 if c {
27 b.WriteString(string(unicode.ToUpper(v)))
28 } else {
29 b.WriteString(string(v))
30 }
31 }
32 if v == '_' || v == ' ' || v == '-' {
33 c = true
34 } else {
35 c = false
36 }
37 }
38 return strings.TrimSpace(b.String())
39 }
40 41 var numberSequence = regexp.MustCompile(`([a-zA-Z])(\d+)([a-zA-Z]?)`)
42 var numberReplacement = []byte(`$1 $2 $3`)
43 44 func addWordBoundariesToNumbers(s string) string {
45 b := []byte(s)
46 b = numberSequence.ReplaceAll(b, numberReplacement)
47 return string(b)
48 }
49