-
Notifications
You must be signed in to change notification settings - Fork 0
/
hooks.go
87 lines (81 loc) · 1.74 KB
/
hooks.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
/*
* Copyright (c) 2023.
* all right reserved by gnodux<gnodux@gmail.com>
*/
package sqlxx
import "reflect"
type BeforeUpdate interface {
BeforeUpdate() error
}
type AfterUpdate interface {
AfterUpdate() error
}
type BeforeInsert interface {
BeforeInsert() error
}
type AfterInsert interface {
AfterInsert() error
}
type BeforeDelete interface {
BeforeDelete() error
}
type AfterDelete interface {
AfterDelete() error
}
func EvalBeforeHooks[T any](entities ...T) error {
for idx, _ := range entities {
if reflect.TypeOf(entities[idx]).Kind() == reflect.Ptr {
if err := EvalBeforeHook(entities[idx]); err != nil {
return err
}
} else {
if err := EvalBeforeHook(&entities[idx]); err != nil {
return err
}
}
}
return nil
}
// EvalBeforeHook eval before hook
// 如果entity是nil,那么不会调用任何hook
// 如果entity是struct 而非指针,那么在调用EvalBeforeHook之前,需要先将entity转换为指针
func EvalBeforeHook(entity any) error {
switch e := entity.(type) {
case nil:
return nil
case BeforeUpdate:
return e.BeforeUpdate()
case BeforeInsert:
return e.BeforeInsert()
case BeforeDelete:
return e.BeforeDelete()
}
return nil
}
func EvalAfterHooks[T any](entities ...T) error {
for idx, _ := range entities {
if reflect.TypeOf(entities[idx]).Kind() == reflect.Ptr {
if err := EvalAfterHook(entities[idx]); err != nil {
return err
}
} else {
if err := EvalAfterHook(&entities[idx]); err != nil {
return err
}
}
}
return nil
}
func EvalAfterHook(entity any) error {
switch e := entity.(type) {
case nil:
return nil
case AfterUpdate:
return e.AfterUpdate()
case AfterInsert:
return e.AfterInsert()
case AfterDelete:
return e.AfterDelete()
}
return nil
}