11package dbo
22
3- import "gorm.io/gorm"
3+ import (
4+ "strings"
5+
6+ "github.com/Cyberpull/gokit/fmt"
7+ "gorm.io/gorm"
8+ )
49
510type SeederHandler func (db * gorm.DB ) (err error )
611
12+ type SeederEntry interface {
13+ Name () string
14+ Handler (db * gorm.DB ) (err error )
15+ }
16+
717type dbSeeder struct {
818 opts * Options
19+ entries []SeederEntry
920 handlers []SeederHandler
1021}
1122
12- func (s * dbSeeder ) Add (handlers ... SeederHandler ) {
13- s .handlers = append (s .handlers , handlers ... )
23+ func (x * dbSeeder ) Add (handlers ... SeederHandler ) {
24+ x .handlers = append (x .handlers , handlers ... )
25+ }
26+
27+ func (x * dbSeeder ) AddEntries (entries ... SeederEntry ) {
28+ x .entries = append (x .entries , entries ... )
1429}
1530
16- func (s * dbSeeder ) Run (db * gorm.DB ) (err error ) {
17- for _ , handler := range s .handlers {
31+ func (x * dbSeeder ) Run (db * gorm.DB ) (err error ) {
32+ for _ , entry := range x .entries {
33+ tx := NewSession (db )
34+
35+ if err = x .RunEntry (tx , entry ); err != nil {
36+ return
37+ }
38+ }
39+
40+ for _ , handler := range x .handlers {
1841 tx := NewSession (db )
1942
2043 if err = handler (tx ); err != nil {
@@ -25,6 +48,22 @@ func (s *dbSeeder) Run(db *gorm.DB) (err error) {
2548 return
2649}
2750
51+ func (x * dbSeeder ) RunEntry (db * gorm.DB , entry SeederEntry ) (err error ) {
52+ name := strings .TrimSpace (entry .Name ())
53+
54+ fmt .Magenta .Printf ("Seeding '%v'... " , name )
55+
56+ err = entry .Handler (db )
57+
58+ if err != nil {
59+ return
60+ }
61+
62+ fmt .Magenta .Println (" Completed!" )
63+
64+ return
65+ }
66+
2867// ===================
2968
3069var Seeder dbSeeder
@@ -35,8 +74,9 @@ func newSeeder(opts *Options) *dbSeeder {
3574 return s
3675}
3776
38- func initSeeders (s * dbSeeder ) {
39- s .handlers = make ([]SeederHandler , 0 )
77+ func initSeeders (x * dbSeeder ) {
78+ x .entries = []SeederEntry {}
79+ x .handlers = []SeederHandler {}
4080}
4181
4282func init () {
0 commit comments