/
meta.go
75 lines (62 loc) · 1.77 KB
/
meta.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
package exchange
import (
"reflect"
"github.com/qor/qor"
"github.com/qor/qor/resource"
"github.com/qor/roles"
)
// Meta defines importable/exportable fields
type Meta struct {
base *Resource
resource.Meta
Name string
Header string
Valuer func(interface{}, *qor.Context) interface{}
Setter func(resource interface{}, metaValue *resource.MetaValue, context *qor.Context)
Permission *roles.Permission
}
// GetMetas get defined sub metas
func (meta *Meta) GetMetas() []resource.Metaor {
return []resource.Metaor{}
}
// GetResource get its resource
func (meta *Meta) GetResource() resource.Resourcer {
return nil
}
func (meta *Meta) updateMeta() {
meta.Meta = resource.Meta{
Name: meta.Name,
FieldName: meta.FieldName,
Setter: meta.Setter,
Valuer: meta.Valuer,
Permission: meta.Permission,
BaseResource: meta.base,
}
meta.PreInitialize()
if meta.FieldStruct != nil {
if injector, ok := reflect.New(meta.FieldStruct.Struct.Type).Interface().(resource.ConfigureMetaBeforeInitializeInterface); ok {
injector.ConfigureQorMetaBeforeInitialize(meta)
}
}
meta.Initialize()
if meta.FieldStruct != nil {
if injector, ok := reflect.New(meta.FieldStruct.Struct.Type).Interface().(resource.ConfigureMetaInterface); ok {
injector.ConfigureQorMeta(meta)
}
}
meta.SetFormattedValuer(func(record interface{}, context *qor.Context) interface{} {
if valuer := meta.GetValuer(); valuer != nil {
result := valuer(record, context)
if reflectValue := reflect.ValueOf(result); reflectValue.IsValid() {
if reflectValue.Kind() == reflect.Ptr {
if reflectValue.IsNil() || !reflectValue.Elem().IsValid() {
return ""
}
result = reflectValue.Elem().Interface()
}
return result
}
}
return ""
})
}