github.com/codykaup/genqlient@v0.6.2/generate/util.go (about) 1 package generate 2 3 import ( 4 "strings" 5 "unicode" 6 "unicode/utf8" 7 ) 8 9 func reverse(slice []string) { 10 for left, right := 0, len(slice)-1; left < right; left, right = left+1, right-1 { 11 slice[left], slice[right] = slice[right], slice[left] 12 } 13 } 14 15 func changeFirst(s string, f func(rune) rune) string { 16 c, n := utf8.DecodeRuneInString(s) 17 if c == utf8.RuneError { // empty or invalid 18 return s 19 } 20 return string(f(c)) + s[n:] 21 } 22 23 func lowerFirst(s string) string { 24 return changeFirst(strings.TrimLeft(s, "_"), unicode.ToLower) 25 } 26 27 func upperFirst(s string) string { 28 return changeFirst(strings.TrimLeft(s, "_"), unicode.ToUpper) 29 } 30 31 func goConstName(s string) string { 32 if strings.TrimLeft(s, "_") == "" { 33 return s 34 } 35 var prev rune 36 return strings.Map(func(r rune) rune { 37 var ret rune 38 if r == '_' { 39 ret = -1 40 } else if prev == '_' || prev == 0 { 41 ret = unicode.ToUpper(r) 42 } else { 43 ret = unicode.ToLower(r) 44 } 45 prev = r 46 return ret 47 }, s) 48 } 49 50 // https://go.dev/ref/spec#Keywords 51 var goKeywords = map[string]bool{ 52 "break": true, 53 "default": true, 54 "func": true, 55 "interface": true, 56 "select": true, 57 "case": true, 58 "defer": true, 59 "go": true, 60 "map": true, 61 "struct": true, 62 "chan": true, 63 "else": true, 64 "goto": true, 65 "package": true, 66 "switch": true, 67 "const": true, 68 "fallthrough": true, 69 "if": true, 70 "range": true, 71 "type": true, 72 "continue": true, 73 "for": true, 74 "import": true, 75 "return": true, 76 "var": true, 77 }