-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodels.utils.go
81 lines (63 loc) · 1.34 KB
/
models.utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package pgotask
import (
"fmt"
"reflect"
"strings"
)
type model interface {
TableName() string
}
func table[M model]() string {
var model M
return model.TableName()
}
func column[M model](column string) string {
var model M
modelTyp := reflect.TypeOf(model)
numField := modelTyp.NumField()
for i := range numField {
tag, ok := modelTyp.Field(i).Tag.Lookup("db")
if !ok {
continue
}
if tag != column {
continue
}
return tag
}
panic(fmt.Errorf("column %s not present in Model %T", column, model))
}
func prefix(prefix, column string) string {
return prefix + "." + column
}
func join(columns []string) string {
return strings.Join(columns, ",\n\t")
}
func columns[M model](tablePrefix bool, columns ...string) []string {
if len(columns) > 0 {
columnsOut := make([]string, 0, len(columns))
for _, c := range columns {
column := column[M](c)
if tablePrefix {
column = prefix(table[M](), column)
}
columnsOut = append(columnsOut, column)
}
return columnsOut
}
var model M
modelTyp := reflect.TypeOf(model)
numField := modelTyp.NumField()
columnTags := make([]string, 0, numField)
for i := range numField {
tag, ok := modelTyp.Field(i).Tag.Lookup("db")
if !ok {
continue
}
if tablePrefix {
tag = prefix(table[M](), tag)
}
columnTags = append(columnTags, tag)
}
return columnTags
}