forked from sqlc-dev/sqlc
/
go_type.go
51 lines (46 loc) · 1.28 KB
/
go_type.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
package golang
import (
"github.com/kyleconroy/sqlc/internal/codegen/sdk"
"github.com/kyleconroy/sqlc/internal/plugin"
)
func goType(req *plugin.CodeGenRequest, col *plugin.Column) string {
// Check if the column's type has been overridden
for _, oride := range req.Settings.Overrides {
if oride.GoType.TypeName == "" {
continue
}
sameTable := sdk.Matches(oride, col.Table, req.Catalog.DefaultSchema)
if oride.Column != "" && sdk.MatchString(oride.ColumnName, col.Name) && sameTable {
return oride.GoType.TypeName
}
}
typ := goInnerType(req, col)
if col.IsArray {
return "[]" + typ
}
return typ
}
func goInnerType(req *plugin.CodeGenRequest, col *plugin.Column) string {
columnType := sdk.DataType(col.Type)
notNull := col.NotNull || col.IsArray
// package overrides have a higher precedence
for _, oride := range req.Settings.Overrides {
if oride.GoType.TypeName == "" {
continue
}
if oride.DbType != "" && oride.DbType == columnType && oride.Nullable != notNull {
return oride.GoType.TypeName
}
}
// TODO: Extend the engine interface to handle types
switch req.Settings.Engine {
case "mysql":
return mysqlType(req, col)
case "postgresql":
return postgresType(req, col)
case "_lemon":
return sqliteType(req, col)
default:
return "interface{}"
}
}