github.com/wawandco/oxplugins@v0.7.11/tools/buffalo/model/attributes.go (about)

     1  package model
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/gobuffalo/flect/name"
     7  )
     8  
     9  type attr struct {
    10  	Name   name.Ident
    11  	goType string
    12  }
    13  
    14  // GoType returns the Go type for an Attr based on its type
    15  func (a attr) GoType() string {
    16  	switch strings.ToLower(a.goType) {
    17  	case "text":
    18  		return "string"
    19  	case "timestamp", "datetime", "date", "time":
    20  		return "time.Time"
    21  	case "nulls.bool":
    22  		return "nulls.Bool"
    23  	case "nulls.int":
    24  		return "nulls.Int"
    25  	case "nulls.decimal", "nulls.float":
    26  		return "nulls.Float64"
    27  	case "nulls.text":
    28  		return "nulls.String"
    29  	case "nulls.time":
    30  		return "nulls.Time"
    31  	case "nulls.uuid":
    32  		return "nulls.UUID"
    33  	case "uuid":
    34  		return "uuid.UUID"
    35  	case "json", "jsonb":
    36  		return "slices.Map"
    37  	case "[]string":
    38  		return "slices.String"
    39  	case "[]int":
    40  		return "slices.Int"
    41  	case "slices.float", "[]float", "[]float32", "[]float64":
    42  		return "slices.Float"
    43  	case "decimal", "float":
    44  		return "float64"
    45  	case "[]byte", "blob":
    46  		return "[]byte"
    47  	default:
    48  		return a.goType
    49  	}
    50  }
    51  
    52  func buildAttrs(args []string) []attr {
    53  	var attrs []attr
    54  	defaults := defaultAttrs(args)
    55  	args = append(defaults, args...)
    56  
    57  	for _, arg := range args {
    58  		slice := strings.Split(arg, ":")
    59  		if len(slice) == 1 {
    60  			slice = append(slice, "string")
    61  		}
    62  
    63  		attrs = append(attrs, attr{
    64  			Name:   name.New(slice[0]),
    65  			goType: strings.ToLower(slice[1]),
    66  		})
    67  	}
    68  
    69  	return attrs
    70  }
    71  
    72  // defaultAttrs appends the default attributes if they are not specified
    73  func defaultAttrs(args []string) []string {
    74  	defaults := []string{"id:uuid", "created_at:timestamp", "updated_at:timestamp"}
    75  
    76  	if len(args) == 0 {
    77  		return defaults
    78  	}
    79  
    80  	m := make(map[string]bool)
    81  	for _, arg := range args {
    82  		element := strings.ToLower(strings.Split(arg, ":")[0])
    83  		if _, ok := m[element]; !ok {
    84  			m[element] = true
    85  		}
    86  	}
    87  
    88  	attrs := []string{}
    89  	if _, ok := m["id"]; !ok {
    90  		attrs = append(attrs, defaults[0])
    91  	}
    92  
    93  	if _, ok := m["created_at"]; !ok {
    94  		attrs = append(attrs, defaults[1])
    95  	}
    96  
    97  	if _, ok := m["updated_at"]; !ok {
    98  		attrs = append(attrs, defaults[2])
    99  	}
   100  
   101  	return attrs
   102  }