-
Notifications
You must be signed in to change notification settings - Fork 0
/
post_completer.go
46 lines (41 loc) · 1006 Bytes
/
post_completer.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
package zinc
import (
"reflect"
)
type PostCompleter[E any, FID comparable, FE any] struct {
Disabled bool
Collect func(elem E, foreignIds []FID) []FID
Query func(foreignIds []FID) (map[FID]FE, error)
Complete func(elem E, m map[FID]FE) error
}
var _ PostProcessor = PostCompleter[struct{}, int, struct{}]{}
func (c PostCompleter[E, FID, FE]) PostProcess(resultVal reflect.Value) error {
if c.Disabled {
return nil
}
if c.Collect == nil || c.Query == nil || c.Complete == nil {
return nil
}
var foreignIds []FID
if err := ForeachResult(resultVal, func(elem E) error {
foreignIds = c.Collect(elem, foreignIds)
return nil
}); err != nil {
return err
}
m, err := c.Query(foreignIds)
if err != nil {
return err
}
if err := ForeachResult(resultVal, func(elem E) error {
return c.Complete(elem, m)
}); err != nil {
return err
}
return nil
}
func (c PostCompleter[E, FID, FE]) If(enabled bool) PostCompleter[E, FID, FE] {
c1 := c
c1.Disabled = !enabled
return c1
}