6dac631a93
- Add joinSlices - Add ways to pull apart a slice of SQLColumnDef - Try to stop generating join tables (but it still gens for some reason)
169 lines
4.3 KiB
Go
169 lines
4.3 KiB
Go
// Package strmangle is used exclusively by the templates in sqlboiler.
|
|
// There are many helper functions to deal with bdb.* values as well
|
|
// as string manipulation. Because it is focused on pipelining inside templates
|
|
// you will see some odd parameter ordering.
|
|
package strmangle
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/jinzhu/inflection"
|
|
)
|
|
|
|
// Plural converts singular words to plural words (eg: person to people)
|
|
func Plural(name string) string {
|
|
splits := strings.Split(name, "_")
|
|
splits[len(splits)-1] = inflection.Plural(splits[len(splits)-1])
|
|
return strings.Join(splits, "_")
|
|
}
|
|
|
|
// Singular converts plural words to singular words (eg: people to person)
|
|
func Singular(name string) string {
|
|
splits := strings.Split(name, "_")
|
|
splits[len(splits)-1] = inflection.Singular(splits[len(splits)-1])
|
|
return strings.Join(splits, "_")
|
|
}
|
|
|
|
// TitleCase changes a snake-case variable name
|
|
// into a go styled object variable name of "ColumnName".
|
|
// titleCase also fully uppercases "ID" components of names, for example
|
|
// "column_name_id" to "ColumnNameID".
|
|
func TitleCase(name string) string {
|
|
splits := strings.Split(name, "_")
|
|
|
|
for i, split := range splits {
|
|
if split == "id" {
|
|
splits[i] = "ID"
|
|
continue
|
|
}
|
|
|
|
splits[i] = strings.Title(split)
|
|
}
|
|
|
|
return strings.Join(splits, "")
|
|
}
|
|
|
|
// CamelCase takes a variable name in the format of "var_name" and converts
|
|
// it into a go styled variable name of "varName".
|
|
// camelCase also fully uppercases "ID" components of names, for example
|
|
// "var_name_id" to "varNameID".
|
|
func CamelCase(name string) string {
|
|
splits := strings.Split(name, "_")
|
|
|
|
for i, split := range splits {
|
|
if split == "id" && i > 0 {
|
|
splits[i] = "ID"
|
|
continue
|
|
}
|
|
|
|
if i == 0 {
|
|
continue
|
|
}
|
|
|
|
splits[i] = strings.Title(split)
|
|
}
|
|
|
|
return strings.Join(splits, "")
|
|
}
|
|
|
|
// StringMap maps a function over a slice of strings.
|
|
func StringMap(modifier func(string) string, strs []string) []string {
|
|
ret := make([]string, len(strs))
|
|
|
|
for i, str := range strs {
|
|
ret[i] = modifier(str)
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
// MakeDBName takes a table name in the format of "table_name" and a
|
|
// column name in the format of "column_name" and returns a name used in the
|
|
// `db:""` component of an object in the format of "table_name_column_name"
|
|
func MakeDBName(tableName, colName string) string {
|
|
return fmt.Sprintf("%s_%s", tableName, colName)
|
|
}
|
|
|
|
// HasElement checks to see if the string is found in the string slice
|
|
func HasElement(str string, slice []string) bool {
|
|
for _, s := range slice {
|
|
if str == s {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// PrefixStringSlice with the given str.
|
|
func PrefixStringSlice(str string, strs []string) []string {
|
|
ret := make([]string, len(strs))
|
|
|
|
for i, s := range strs {
|
|
ret[i] = fmt.Sprintf("%s%s", str, s)
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
// GenerateParamFlags generates the SQL statement parameter flags
|
|
// For example, $1,$2,$3 etc. It will start counting at startAt.
|
|
func GenerateParamFlags(colCount int, startAt int) string {
|
|
cols := make([]string, 0, colCount)
|
|
|
|
for i := startAt; i < colCount+startAt; i++ {
|
|
cols = append(cols, fmt.Sprintf("$%d", i))
|
|
}
|
|
|
|
return strings.Join(cols, ",")
|
|
}
|
|
|
|
// WhereClause returns the where clause using start as the $ flag index
|
|
// For example, if start was 2 output would be: "colthing=$2 AND colstuff=$3"
|
|
func WhereClause(cols []string, start int) string {
|
|
if start == 0 {
|
|
panic("0 is not a valid start number for whereClause")
|
|
}
|
|
|
|
ret := make([]string, len(cols))
|
|
for i, c := range cols {
|
|
ret[i] = fmt.Sprintf(`"%s"=$%d`, c, start+i)
|
|
}
|
|
|
|
return strings.Join(ret, " AND ")
|
|
}
|
|
|
|
// DriverUsesLastInsertID returns whether the database driver supports the
|
|
// sql.Result interface.
|
|
func DriverUsesLastInsertID(driverName string) bool {
|
|
switch driverName {
|
|
case "postgres":
|
|
return false
|
|
default:
|
|
return true
|
|
}
|
|
}
|
|
|
|
// Substring returns a substring of str starting at index start and going
|
|
// to end-1.
|
|
func Substring(start, end int, str string) string {
|
|
return str[start:end]
|
|
}
|
|
|
|
// JoinSlices merges two string slices of equal length
|
|
func JoinSlices(sep string, a, b []string) []string {
|
|
lna, lnb := len(a), len(b)
|
|
if lna != lnb {
|
|
panic("joinSlices: can only merge slices of same length")
|
|
} else if lna == 0 {
|
|
return nil
|
|
}
|
|
|
|
ret := make([]string, len(a))
|
|
for i, elem := range a {
|
|
ret[i] = fmt.Sprintf("%s%s%s", elem, sep, b[i])
|
|
}
|
|
|
|
return ret
|
|
}
|