This repository has been archived by the owner on Apr 9, 2021. It is now read-only.
/
types.go
148 lines (129 loc) · 2.75 KB
/
types.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package db
import (
"database/sql/driver"
"encoding/json"
)
// H is map[string]interface{} abbr
type H map[string]interface{}
// Array MySQL json/array type
// usage eg.
// type User struct {
// ID uint
// Name string
// Tags db.Array `gorm:"type:json"`
// }
type Array []interface{}
// Scan is custom overwrite func
func (a *Array) Scan(value interface{}) error {
var array []interface{}
err := json.Unmarshal(value.([]byte), &array)
if err != nil {
return err
}
*a = array
return nil
}
// Value is custom overwrite func
func (a Array) Value() (driver.Value, error) {
msg, err := json.Marshal(a)
if err != nil {
return nil, err
}
return string(msg), nil
}
// StringArray convert db Array to string array
func (a Array) StringArray() []string {
new := make([]string, len(a))
for i, v := range a {
new[i] = v.(string)
}
return new
}
// UintArray convert db Array to uint array
func (a Array) UintArray() []uint {
new := make([]uint, len(a))
for k, v := range a {
if ui, ok := v.(uint); ok {
new[k] = ui
} else {
new[k] = uint(v.(float64))
}
}
return new
}
// IntArray convert db array to int array
func (a Array) IntArray() []int {
new := make([]int, len(a))
for k, v := range a {
if i, ok := v.(int); ok {
new[k] = i
} else {
new[k] = int(v.(float64))
}
}
return new
}
// StringArray string array to db Array
func StringArray(arr []string) Array {
new := make([]interface{}, len(arr))
for i, item := range arr {
new[i] = item
}
return new
}
// IntArray int array to db array
func IntArray(array []int) Array {
new := make([]interface{}, len(array))
for i, item := range array {
new[i] = item
}
return new
}
// --------------------------------------------------------------------
// Map MySQL json/map type
// usage eg.
// type User struct {
// ID uint
// Name string
// Tags db.Map `gorm:"type:json"`
// }
type Map map[string]interface{}
// Scan is custom overwrite func
func (m *Map) Scan(value interface{}) error {
var _map map[string]interface{}
err := json.Unmarshal(value.([]byte), &_map)
if err != nil {
return err
}
*m = _map
return nil
}
// Value is custom overwrite func
func (m Map) Value() (driver.Value, error) {
msg, err := json.Marshal(m)
if err != nil {
return nil, err
}
return string(msg), nil
}
// StringMap convert map[string]string to db Map
func StringMap(old map[string]string) Map {
var new map[string]interface{}
for k, v := range old {
new[k] = v
}
return new
}
// --------------------------------------------------------------------
// GetJSON return obj json string
func GetJSON(obj interface{}) interface{} {
if obj == nil {
return nil
}
if msg, err := json.Marshal(obj); err == nil {
if str := string(msg); len(str) != 0 {
return string(msg)
}
}
return nil
}