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  }