github.com/unionj-cloud/go-doudou/v2@v2.3.5/toolkit/gormgen/internal/model/options.go (about) 1 package model 2 3 import ( 4 "gorm.io/gorm" 5 ) 6 7 // SchemaNameOpt schema name option 8 type SchemaNameOpt func(*gorm.DB) string 9 10 var defaultSchemaNameOpt = SchemaNameOpt(func(db *gorm.DB) string { return db.Migrator().CurrentDatabase() }) 11 12 // Option field option 13 type Option interface{ OptionType() string } 14 15 const fieldType = "field" 16 17 // FieldOption ... 18 type FieldOption interface { 19 Option 20 Operator() func(*Field) *Field 21 } 22 23 const methodType = "method" 24 25 // MethodOption ... 26 type MethodOption interface { 27 Option 28 Methods() (methods []interface{}) 29 } 30 31 var ( 32 _ Option = ModifyFieldOpt(nil) 33 _ Option = FilterFieldOpt(nil) 34 _ Option = CreateFieldOpt(nil) 35 36 _ Option = AddMethodOpt(nil) 37 ) 38 39 // ModifyFieldOpt modify field option 40 type ModifyFieldOpt func(*Field) *Field 41 42 // OptionType implement for interface Option 43 func (ModifyFieldOpt) OptionType() string { return fieldType } 44 45 // Operator implement for FieldOpt 46 func (o ModifyFieldOpt) Operator() func(*Field) *Field { return o } 47 48 // FilterFieldOpt filter field option 49 type FilterFieldOpt ModifyFieldOpt 50 51 // OptionType implement for interface Option 52 func (FilterFieldOpt) OptionType() string { return fieldType } 53 54 // Operator implement for FieldOpt 55 func (o FilterFieldOpt) Operator() func(*Field) *Field { return o } 56 57 // CreateFieldOpt create field option 58 type CreateFieldOpt ModifyFieldOpt 59 60 // OptionType implement for interface Option 61 func (CreateFieldOpt) OptionType() string { return fieldType } 62 63 // Operator implement for FieldOpt 64 func (o CreateFieldOpt) Operator() func(*Field) *Field { return o } 65 66 // AddMethodOpt diy method option 67 type AddMethodOpt func() (methods []interface{}) 68 69 // OptionType implement for interface Option 70 func (AddMethodOpt) OptionType() string { return methodType } 71 72 // Methods ... 73 func (o AddMethodOpt) Methods() []interface{} { return o() } 74 75 func sortOptions(opts []Option) (modifyOpts []FieldOption, filterOpts []FieldOption, createOpts []FieldOption, methodOpt []MethodOption) { 76 for _, opt := range opts { 77 switch opt := opt.(type) { 78 case ModifyFieldOpt: 79 modifyOpts = append(modifyOpts, opt) 80 case FilterFieldOpt: 81 filterOpts = append(filterOpts, opt) 82 case CreateFieldOpt: 83 createOpts = append(createOpts, opt) 84 case AddMethodOpt: 85 methodOpt = append(methodOpt, opt) 86 } 87 } 88 return 89 }