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  }