feat: unified naming style for variable names

This commit is contained in:
zhuyasen 2025-05-11 22:50:44 +08:00
parent 3ff6e6efae
commit 42bb6b2132
4 changed files with 150 additions and 128 deletions

View File

@ -0,0 +1,119 @@
package parser
import (
"strings"
"github.com/huandu/xstrings"
)
var peculiarNouns = map[string]string{
"ID": "Id",
"UID": "Uid",
"UUID": "Uuid",
"GUID": "Guid",
"URI": "Uri",
"URL": "Url",
"IP": "Ip",
"QPS": "Qps",
"API": "Api",
"ASCII": "Ascii",
"CPU": "Cpu",
"CSS": "Css",
"DNS": "Dns",
"EOF": "Eof",
"HTML": "Html",
"HTTP": "Http",
"HTTPS": "Https",
"JSON": "Json",
"LHS": "Lhs",
"RAM": "Ram",
"RHS": "Rhs",
"RPC": "Rpc",
"SLA": "Sla",
"SMTP": "Smtp",
"SSH": "Ssh",
"TLS": "Tls",
"TTL": "Ttl",
"UI": "Ui",
"UTF8": "Utf8",
"VM": "Vm",
"XML": "Xml",
"XSRF": "Xsrf",
"XSS": "Xss",
}
func toCamel(s string) string {
str := xstrings.ToCamelCase(s)
name := strings.ToUpper(str)
if _, ok := peculiarNouns[name]; ok {
return name
}
l := len(str)
for k, v := range peculiarNouns {
nl := len(v)
if l > nl {
if str[l-nl:] == v {
str = str[:l-nl] + k
break
}
}
}
if str == "_ID" { // special case for table column ID
str = "ID"
}
return str
}
func firstLetterToLower(str string) string {
if len(str) == 0 {
return str
}
if (str[0] >= 'A' && str[0] <= 'Z') || (str[0] >= 'a' && str[0] <= 'z') {
return strings.ToLower(str[:1]) + str[1:]
}
return str
}
func customToCamel(str string) string {
str = toCamel(str)
if _, ok := peculiarNouns[str]; ok {
str = strings.ToLower(str)
} else {
str = firstLetterToLower(str)
}
return str
}
func customToSnake(str string) string {
str = toCamel(str)
l := len(str)
for k, _ := range peculiarNouns {
if str == k {
str = strings.ToLower(str)
break
}
nl := len(k)
if l > nl {
if str[l-nl:] == k {
str = str[:l-nl] + "_" + strings.ToLower(k)
break
}
}
}
str = xstrings.ToSnakeCase(str)
if strings.HasPrefix(str, "__") {
str = str[1:]
}
return str
}

View File

@ -0,0 +1,31 @@
package parser
import (
"testing"
)
func TestNameFormat(t *testing.T) {
names := [][]string{
{"id_", "_id", "id", "iD", "ID", "Id", "order_id", "orderId", "orderID", "OrderID"},
{"ip_", "_ip", "ip", "iP", "IP", "Ip", "host_ip", "hostIp", "hostIP", "HostIP"},
{"url_", "_url", "url", "uRL", "URL", "Url", "blog_url", "blogUrl", "blogURL", "BlogURL"},
{"_user_name", "user_name", "userName", "UserName"},
{"_zh_中文", "zh_中文", "中文zh"},
}
for _, ns := range names {
var convertNames []string
var convertNames2 []string
var convertNames3 []string
for _, name := range ns {
convertNames = append(convertNames, toCamel(name))
convertNames2 = append(convertNames2, customToCamel(name))
convertNames3 = append(convertNames3, customToSnake(name))
}
t.Log("source: ", ns)
t.Log("toCamel: ", convertNames)
t.Log("customToCamel:", convertNames2)
t.Log("customToSnake:", convertNames3)
println()
}
}

View File

@ -12,7 +12,6 @@ import (
"strings"
"text/template"
"github.com/huandu/xstrings"
"github.com/jinzhu/inflection"
"github.com/zhufuyi/sqlparser/ast"
"github.com/zhufuyi/sqlparser/dependency/mysql"
@ -1287,114 +1286,3 @@ func getDefaultValue(expr ast.ExprNode) (value string) {
}
return value
}
var acronym = map[string]struct{}{
"ID": {},
"IP": {},
}
// nolint
func toCamel(s string) string {
s = strings.TrimSpace(s)
if s == "" {
return s
}
s += "."
n := strings.Builder{}
n.Grow(len(s))
temp := strings.Builder{}
temp.Grow(len(s))
wordFirst := true
for _, v := range []byte(s) {
vIsCap := v >= 'A' && v <= 'Z'
vIsLow := v >= 'a' && v <= 'z'
if wordFirst && vIsLow {
v -= 'a' - 'A'
}
if vIsCap || vIsLow {
temp.WriteByte(v)
wordFirst = false
} else {
isNum := v >= '0' && v <= '9'
wordFirst = isNum || v == '_' || v == ' ' || v == '-' || v == '.'
if temp.Len() > 0 && wordFirst {
word := temp.String()
upper := strings.ToUpper(word)
if _, ok := acronym[upper]; ok {
n.WriteString(upper)
} else {
n.WriteString(word)
}
temp.Reset()
}
if isNum {
n.WriteByte(v)
}
}
}
str := n.String()
if len(str) > 2 {
if str[len(str)-2:] == "Id" {
str = str[:len(str)-2] + "ID"
} else if str[len(str)-2:] == "Ip" {
str = str[:len(str)-2] + "IP"
}
}
return str
}
func firstLetterToLower(str string) string {
if len(str) == 0 {
return str
}
if (str[0] >= 'A' && str[0] <= 'Z') || (str[0] >= 'a' && str[0] <= 'z') {
return strings.ToLower(str[:1]) + str[1:]
}
return str
}
func customToCamel(str string) string {
str = firstLetterToLower(toCamel(str))
if len(str) == 2 {
if str == "iD" {
str = "id"
} else if str == "iP" {
str = "ip"
}
}
return str
}
func customToSnake(str string) string {
if len(str) == 0 {
return str
}
index := 0
for _, c := range str {
if c != '_' {
break
}
index++
}
if index != 0 {
str = str[index:]
}
if len(str) == 2 {
if str == "iD" {
str = "id"
} else if str == "iP" {
str = "ip"
}
}
return xstrings.ToSnakeCase(str)
}

View File

@ -264,22 +264,6 @@ func TestParseSQLs(t *testing.T) {
}
}
func TestConvertNames(t *testing.T) {
names := []string{"_id", "id", "iD", "user_id", "productId", "orderID", "user_name", "ip", "iP", "host_ip", "myIP"}
var convertNames []string
var convertNames2 []string
var convertNames3 []string
for _, name := range names {
convertNames = append(convertNames, toCamel(name))
convertNames2 = append(convertNames2, customToCamel(name))
convertNames3 = append(convertNames3, customToSnake(name))
}
t.Log("source: ", names)
t.Log("toCamel: ", convertNames)
t.Log("customToCamel:", convertNames2)
t.Log("customToSnake:", convertNames3)
}
func Test_parseOption(t *testing.T) {
opts := []Option{
WithDBDriver("foo"),