github.com/opiuman/genqlient@v1.0.0/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  }