github.com/octohelm/storage@v0.0.0-20240516030302-1ac2cc1ea347/pkg/sqlbuilder/column_type.go (about)

     1  package sqlbuilder
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  	"strings"
     7  
     8  	typex "github.com/octohelm/x/types"
     9  )
    10  
    11  func ColumnDefFromTypeAndTag(typ typex.Type, nameAndFlags string) *ColumnDef {
    12  	ct := &ColumnDef{}
    13  	ct.Type = typex.Deref(typ)
    14  
    15  	if strings.Contains(nameAndFlags, ",") {
    16  		for _, flag := range strings.Split(nameAndFlags, ",")[1:] {
    17  			nameAndValue := strings.Split(flag, "=")
    18  			switch strings.ToLower(nameAndValue[0]) {
    19  			case "null":
    20  				ct.Null = true
    21  			case "autoincrement":
    22  				ct.AutoIncrement = true
    23  			case "deprecated":
    24  				rename := ""
    25  				if len(nameAndValue) > 1 {
    26  					rename = nameAndValue[1]
    27  				}
    28  				ct.DeprecatedActions = &DeprecatedActions{RenameTo: rename}
    29  			case "size":
    30  				if len(nameAndValue) == 1 {
    31  					panic(fmt.Errorf("missing size value"))
    32  				}
    33  				length, err := strconv.ParseUint(nameAndValue[1], 10, 64)
    34  				if err != nil {
    35  					panic(fmt.Errorf("invalid size value: %s", err))
    36  				}
    37  				ct.Length = length
    38  			case "decimal":
    39  				if len(nameAndValue) == 1 {
    40  					panic(fmt.Errorf("missing size value"))
    41  				}
    42  				decimal, err := strconv.ParseUint(nameAndValue[1], 10, 64)
    43  				if err != nil {
    44  					panic(fmt.Errorf("invalid decimal value: %s", err))
    45  				}
    46  				ct.Decimal = decimal
    47  			case "default":
    48  				if len(nameAndValue) == 1 {
    49  					panic(fmt.Errorf("missing default value"))
    50  				}
    51  				ct.Default = &nameAndValue[1]
    52  			case "onupdate":
    53  				if len(nameAndValue) == 1 {
    54  					panic(fmt.Errorf("missing onupdate value"))
    55  				}
    56  				ct.OnUpdate = &nameAndValue[1]
    57  			}
    58  		}
    59  	}
    60  	return ct
    61  }
    62  
    63  type ColumnDef struct {
    64  	Type              typex.Type
    65  	DataType          string
    66  	Length            uint64
    67  	Decimal           uint64
    68  	Default           *string
    69  	OnUpdate          *string
    70  	Null              bool
    71  	AutoIncrement     bool
    72  	DeprecatedActions *DeprecatedActions
    73  	Comment           string
    74  	Description       []string
    75  	Relation          []string
    76  }
    77  
    78  type DeprecatedActions struct {
    79  	RenameTo string `name:"rename"`
    80  }