diff options
Diffstat (limited to 'vendor/github.com/shurcooL/graphql/ident/ident.go')
-rw-r--r-- | vendor/github.com/shurcooL/graphql/ident/ident.go | 240 |
1 files changed, 0 insertions, 240 deletions
diff --git a/vendor/github.com/shurcooL/graphql/ident/ident.go b/vendor/github.com/shurcooL/graphql/ident/ident.go deleted file mode 100644 index 29e498ed..00000000 --- a/vendor/github.com/shurcooL/graphql/ident/ident.go +++ /dev/null @@ -1,240 +0,0 @@ -// Package ident provides functions for parsing and converting identifier names -// between various naming convention. It has support for MixedCaps, lowerCamelCase, -// and SCREAMING_SNAKE_CASE naming conventions. -package ident - -import ( - "strings" - "unicode" - "unicode/utf8" -) - -// ParseMixedCaps parses a MixedCaps identifier name. -// -// E.g., "ClientMutationID" -> {"Client", "Mutation", "ID"}. -func ParseMixedCaps(name string) Name { - var words Name - - // Split name at any lower -> Upper or Upper -> Upper,lower transitions. - // Check each word for initialisms. - runes := []rune(name) - w, i := 0, 0 // Index of start of word, scan. - for i+1 <= len(runes) { - eow := false // Whether we hit the end of a word. - if i+1 == len(runes) { - eow = true - } else if unicode.IsLower(runes[i]) && unicode.IsUpper(runes[i+1]) { - // lower -> Upper. - eow = true - } else if i+2 < len(runes) && unicode.IsUpper(runes[i]) && unicode.IsUpper(runes[i+1]) && unicode.IsLower(runes[i+2]) { - // Upper -> Upper,lower. End of acronym, followed by a word. - eow = true - - if string(runes[i:i+3]) == "IDs" { // Special case, plural form of ID initialism. - eow = false - } - } - i++ - if !eow { - continue - } - - // [w, i) is a word. - word := string(runes[w:i]) - if initialism, ok := isInitialism(word); ok { - words = append(words, initialism) - } else if i1, i2, ok := isTwoInitialisms(word); ok { - words = append(words, i1, i2) - } else { - words = append(words, word) - } - w = i - } - return words -} - -// ParseLowerCamelCase parses a lowerCamelCase identifier name. -// -// E.g., "clientMutationId" -> {"client", "Mutation", "Id"}. -func ParseLowerCamelCase(name string) Name { - var words Name - - // Split name at any Upper letters. - runes := []rune(name) - w, i := 0, 0 // Index of start of word, scan. - for i+1 <= len(runes) { - eow := false // Whether we hit the end of a word. - if i+1 == len(runes) { - eow = true - } else if unicode.IsUpper(runes[i+1]) { - // Upper letter. - eow = true - } - i++ - if !eow { - continue - } - - // [w, i) is a word. - words = append(words, string(runes[w:i])) - w = i - } - return words -} - -// ParseScreamingSnakeCase parses a SCREAMING_SNAKE_CASE identifier name. -// -// E.g., "CLIENT_MUTATION_ID" -> {"CLIENT", "MUTATION", "ID"}. -func ParseScreamingSnakeCase(name string) Name { - var words Name - - // Split name at '_' characters. - runes := []rune(name) - w, i := 0, 0 // Index of start of word, scan. - for i+1 <= len(runes) { - eow := false // Whether we hit the end of a word. - if i+1 == len(runes) { - eow = true - } else if runes[i+1] == '_' { - // Underscore. - eow = true - } - i++ - if !eow { - continue - } - - // [w, i) is a word. - words = append(words, string(runes[w:i])) - if i < len(runes) && runes[i] == '_' { - // Skip underscore. - i++ - } - w = i - } - return words -} - -// Name is an identifier name, broken up into individual words. -type Name []string - -// ToMixedCaps expresses identifer name in MixedCaps naming convention. -// -// E.g., "ClientMutationID". -func (n Name) ToMixedCaps() string { - for i, word := range n { - if strings.EqualFold(word, "IDs") { // Special case, plural form of ID initialism. - n[i] = "IDs" - continue - } - if initialism, ok := isInitialism(word); ok { - n[i] = initialism - continue - } - if brand, ok := isBrand(word); ok { - n[i] = brand - continue - } - r, size := utf8.DecodeRuneInString(word) - n[i] = string(unicode.ToUpper(r)) + strings.ToLower(word[size:]) - } - return strings.Join(n, "") -} - -// ToLowerCamelCase expresses identifer name in lowerCamelCase naming convention. -// -// E.g., "clientMutationId". -func (n Name) ToLowerCamelCase() string { - for i, word := range n { - if i == 0 { - n[i] = strings.ToLower(word) - continue - } - r, size := utf8.DecodeRuneInString(word) - n[i] = string(unicode.ToUpper(r)) + strings.ToLower(word[size:]) - } - return strings.Join(n, "") -} - -// isInitialism reports whether word is an initialism. -func isInitialism(word string) (string, bool) { - initialism := strings.ToUpper(word) - _, ok := initialisms[initialism] - return initialism, ok -} - -// isTwoInitialisms reports whether word is two initialisms. -func isTwoInitialisms(word string) (string, string, bool) { - word = strings.ToUpper(word) - for i := 2; i <= len(word)-2; i++ { // Shortest initialism is 2 characters long. - _, ok1 := initialisms[word[:i]] - _, ok2 := initialisms[word[i:]] - if ok1 && ok2 { - return word[:i], word[i:], true - } - } - return "", "", false -} - -// initialisms is the set of initialisms in the MixedCaps naming convention. -// Only add entries that are highly unlikely to be non-initialisms. -// For instance, "ID" is fine (Freudian code is rare), but "AND" is not. -var initialisms = map[string]struct{}{ - // These are the common initialisms from golint. Keep them in sync - // with https://gotools.org/github.com/golang/lint#commonInitialisms. - "ACL": {}, - "API": {}, - "ASCII": {}, - "CPU": {}, - "CSS": {}, - "DNS": {}, - "EOF": {}, - "GUID": {}, - "HTML": {}, - "HTTP": {}, - "HTTPS": {}, - "ID": {}, - "IP": {}, - "JSON": {}, - "LHS": {}, - "QPS": {}, - "RAM": {}, - "RHS": {}, - "RPC": {}, - "SLA": {}, - "SMTP": {}, - "SQL": {}, - "SSH": {}, - "TCP": {}, - "TLS": {}, - "TTL": {}, - "UDP": {}, - "UI": {}, - "UID": {}, - "UUID": {}, - "URI": {}, - "URL": {}, - "UTF8": {}, - "VM": {}, - "XML": {}, - "XMPP": {}, - "XSRF": {}, - "XSS": {}, - - // Additional common initialisms. - "RSS": {}, -} - -// isBrand reports whether word is a brand. -func isBrand(word string) (string, bool) { - brand, ok := brands[strings.ToLower(word)] - return brand, ok -} - -// brands is the map of brands in the MixedCaps naming convention; -// see https://dmitri.shuralyov.com/idiomatic-go#for-brands-or-words-with-more-than-1-capital-letter-lowercase-all-letters. -// Key is the lower case version of the brand, value is the canonical brand spelling. -// Only add entries that are highly unlikely to be non-brands. -var brands = map[string]string{ - "github": "GitHub", -} |