package form
import (
"errors"
"strconv"
"strings"
)
var ErrBadMeasure = errors.New("Bad measurement")
var ErrCalcNotSupported = errors.New("Bad measurement: calc not supported")
func parseNum(inStr string) (float64, error) {
wholeNum, err := strconv.Atoi(inStr)
if err == nil {
return float64(wholeNum), nil
}
floatNum, err := strconv.ParseFloat(inStr, 64)
if err == nil {
return floatNum, nil
}
return 0.0, ErrBadMeasure
}
func ParseMeasure(inStr string) (float64, string, error) {
rawPx, err := parseNum(inStr)
if err == nil {
return rawPx, "px", nil
}
if strings.HasSuffix(inStr, "rem") {
val, err := parseNum(inStr[0 : len(inStr)-3])
return val, "rem", err
}
if strings.HasSuffix(inStr, "em") {
val, err := parseNum(inStr[0 : len(inStr)-2])
return val, "em", err
}
if strings.HasSuffix(inStr, "px") {
val, err := parseNum(inStr[0 : len(inStr)-2])
return val, "px", err
}
if strings.HasSuffix(inStr, "vw") {
val, err := parseNum(inStr[0 : len(inStr)-2])
return val, "vw", err
}
if strings.HasSuffix(inStr, "vh") {
val, err := parseNum(inStr[0 : len(inStr)-2])
return val, "vh", err
}
if strings.HasSuffix(inStr, "%") {
val, err := parseNum(inStr[0 : len(inStr)-1])
return val, "%", err
}
return 0.0, "", ErrBadMeasure
}