forked from gobuffalo/pop
/
options.go
85 lines (78 loc) · 2.2 KB
/
options.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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package model
import (
"path/filepath"
"strings"
"github.com/gobuffalo/attrs"
"github.com/pkg/errors"
)
// Options for generating a new model
type Options struct {
Name string `json:"name"`
Attrs attrs.Attrs `json:"props"`
Path string `json:"path"`
Package string `json:"package"`
TestPackage string `json:"test_package"`
Encoding string `json:"encoding"`
ForceDefaultID bool `json:"force_default_id"`
ForceDefaultTimestamps bool `json:"force_default_timestamps"`
}
// Validate that options are usuable
func (opts *Options) Validate() error {
if len(opts.Name) == 0 {
return errors.New("you must set a name for your model")
}
if len(opts.Path) == 0 {
opts.Path = "models"
}
if len(opts.Package) == 0 {
opts.Package = filepath.Base(opts.Path)
}
if len(opts.TestPackage) == 0 {
opts.TestPackage = opts.Package
}
if len(opts.Encoding) == 0 {
opts.Encoding = "json"
}
opts.Encoding = strings.ToLower(opts.Encoding)
if opts.Encoding != "json" && opts.Encoding != "jsonapi" && opts.Encoding != "xml" {
return errors.Errorf("unsupported encoding option %s", opts.Encoding)
}
return opts.forceDefaults()
}
func (opts *Options) forceDefaults() error {
var idFound, createdAtFound, updatedAtFound bool
for _, a := range opts.Attrs {
switch a.Name.Underscore().String() {
case "id":
idFound = true
case "created_at":
createdAtFound = true
case "updated_at":
updatedAtFound = true
}
}
// Add a default UUID, if no custom ID is provided
if opts.ForceDefaultID && !idFound {
id, err := attrs.Parse("id:uuid")
if err != nil {
return err
}
opts.Attrs = append([]attrs.Attr{id}, opts.Attrs...)
}
// Add default timestamp columns if they were not provided
if opts.ForceDefaultTimestamps && !createdAtFound {
createdAt, err := attrs.Parse("created_at:time")
if err != nil {
return err
}
opts.Attrs = append(opts.Attrs, createdAt)
}
if opts.ForceDefaultTimestamps && !updatedAtFound {
updatedAt, err := attrs.Parse("updated_at:time")
if err != nil {
return err
}
opts.Attrs = append(opts.Attrs, updatedAt)
}
return nil
}