123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- package gorm
- import (
- "bytes"
- "strings"
- )
- type Namer func(string) string
- type NamingStrategy struct {
- DB Namer
- Table Namer
- Column Namer
- }
- var TheNamingStrategy = &NamingStrategy{
- DB: defaultNamer,
- Table: defaultNamer,
- Column: defaultNamer,
- }
- func AddNamingStrategy(ns *NamingStrategy) {
- if ns.DB == nil {
- ns.DB = defaultNamer
- }
- if ns.Table == nil {
- ns.Table = defaultNamer
- }
- if ns.Column == nil {
- ns.Column = defaultNamer
- }
- TheNamingStrategy = ns
- }
- func (ns *NamingStrategy) DBName(name string) string {
- return ns.DB(name)
- }
- func (ns *NamingStrategy) TableName(name string) string {
- return ns.Table(name)
- }
- func (ns *NamingStrategy) ColumnName(name string) string {
- return ns.Column(name)
- }
- func ToDBName(name string) string {
- return TheNamingStrategy.DBName(name)
- }
- func ToTableName(name string) string {
- return TheNamingStrategy.TableName(name)
- }
- func ToColumnName(name string) string {
- return TheNamingStrategy.ColumnName(name)
- }
- var smap = newSafeMap()
- func defaultNamer(name string) string {
- const (
- lower = false
- upper = true
- )
- if v := smap.Get(name); v != "" {
- return v
- }
- if name == "" {
- return ""
- }
- var (
- value = commonInitialismsReplacer.Replace(name)
- buf = bytes.NewBufferString("")
- lastCase, currCase, nextCase, nextNumber bool
- )
- for i, v := range value[:len(value)-1] {
- nextCase = bool(value[i+1] >= 'A' && value[i+1] <= 'Z')
- nextNumber = bool(value[i+1] >= '0' && value[i+1] <= '9')
- if i > 0 {
- if currCase == upper {
- if lastCase == upper && (nextCase == upper || nextNumber == upper) {
- buf.WriteRune(v)
- } else {
- if value[i-1] != '_' && value[i+1] != '_' {
- buf.WriteRune('_')
- }
- buf.WriteRune(v)
- }
- } else {
- buf.WriteRune(v)
- if i == len(value)-2 && (nextCase == upper && nextNumber == lower) {
- buf.WriteRune('_')
- }
- }
- } else {
- currCase = upper
- buf.WriteRune(v)
- }
- lastCase = currCase
- currCase = nextCase
- }
- buf.WriteByte(value[len(value)-1])
- s := strings.ToLower(buf.String())
- smap.Set(name, s)
- return s
- }
|