github.com/reggieriser/pop@v4.13.1+incompatible/genny/model/options.go (about) 1 package model 2 3 import ( 4 "path/filepath" 5 "strings" 6 7 "github.com/gobuffalo/attrs" 8 "github.com/pkg/errors" 9 ) 10 11 // Options for generating a new model 12 type Options struct { 13 Name string `json:"name"` 14 Attrs attrs.Attrs `json:"props"` 15 Path string `json:"path"` 16 Package string `json:"package"` 17 TestPackage string `json:"test_package"` 18 Encoding string `json:"encoding"` 19 ForceDefaultID bool `json:"force_default_id"` 20 ForceDefaultTimestamps bool `json:"force_default_timestamps"` 21 } 22 23 // Validate that options are usuable 24 func (opts *Options) Validate() error { 25 if len(opts.Name) == 0 { 26 return errors.New("you must set a name for your model") 27 } 28 if len(opts.Path) == 0 { 29 opts.Path = "models" 30 } 31 if len(opts.Package) == 0 { 32 opts.Package = filepath.Base(opts.Path) 33 } 34 if len(opts.TestPackage) == 0 { 35 opts.TestPackage = opts.Package 36 } 37 if len(opts.Encoding) == 0 { 38 opts.Encoding = "json" 39 } 40 opts.Encoding = strings.ToLower(opts.Encoding) 41 if opts.Encoding != "json" && opts.Encoding != "jsonapi" && opts.Encoding != "xml" { 42 return errors.Errorf("unsupported encoding option %s", opts.Encoding) 43 } 44 45 return opts.forceDefaults() 46 } 47 48 func (opts *Options) forceDefaults() error { 49 var idFound, createdAtFound, updatedAtFound bool 50 for _, a := range opts.Attrs { 51 switch a.Name.Underscore().String() { 52 case "id": 53 idFound = true 54 case "created_at": 55 createdAtFound = true 56 case "updated_at": 57 updatedAtFound = true 58 } 59 } 60 // Add a default UUID, if no custom ID is provided 61 if opts.ForceDefaultID && !idFound { 62 id, err := attrs.Parse("id:uuid") 63 if err != nil { 64 return err 65 } 66 opts.Attrs = append([]attrs.Attr{id}, opts.Attrs...) 67 } 68 69 // Add default timestamp columns if they were not provided 70 if opts.ForceDefaultTimestamps && !createdAtFound { 71 createdAt, err := attrs.Parse("created_at:time") 72 if err != nil { 73 return err 74 } 75 opts.Attrs = append(opts.Attrs, createdAt) 76 } 77 if opts.ForceDefaultTimestamps && !updatedAtFound { 78 updatedAt, err := attrs.Parse("updated_at:time") 79 if err != nil { 80 return err 81 } 82 opts.Attrs = append(opts.Attrs, updatedAt) 83 } 84 return nil 85 }