package models import ( "fmt" "github.com/gin-gonic/gin" "gorm.io/gorm" "strconv" "strings" ) type PaperSize string const ( A3 PaperSize = "A3" A4 PaperSize = "A4" A5 PaperSize = "A5" SRA3 PaperSize = "SRA3" ) func ParseSize(s string) (c PaperSize, err error) { s = strings.ToUpper(s) if s == "A3" { return A3, nil } else if s == "A4" { return A4, nil } else if s == "A5" { return A5, nil } else if s == "SRA3" { return SRA3, nil } return c, fmt.Errorf("Cannot parse category %s", s) } type Paper struct { gorm.Model Name string `json:"name" binding:"required" gorm:"not null"` Brand string `json:"brand" binding:"required"` Size PaperSize `json:"size" binding:"required"` Weight int `json:"weight" binding:"required"` Price float64 `json:"price" binding:"required"` } func NewPaper(ctx *gin.Context) (Paper, error) { name := ctx.PostForm("name") brand := ctx.PostForm("brand") sizeTmp := ctx.PostForm("size") weightTmp := ctx.PostForm("weight") priceTmp := ctx.PostForm("price") size, err := ParseSize(sizeTmp) if err != nil { return Paper{}, fmt.Errorf("Couldnt parse Size") } weight, err := strconv.Atoi(weightTmp) if err != nil { return Paper{}, fmt.Errorf("Couldnt parse Weight") } price, err := strconv.ParseFloat(priceTmp, 64) if err != nil { return Paper{}, fmt.Errorf("Couldnt parse Price") } if name == "" || brand == "" { return Paper{}, fmt.Errorf("Name or brand empty") } // Convert the price string to float64 tag := Paper{ Name: name, Brand: brand, Size: size, Weight: weight, Price: price, } return tag, nil }