package template import ( "errors" "fmt" "gopkg.in/Knetic/govaluate.v3" ) // ErrNonFloatValue is returned when the result of the expression is not a float64. var ErrNonFloatValue = errors.New("failed to cast expression result for float64") // Value describes a measurement or dimension in the templates. type Value string // Evaluate a Value as [govaluate.EvaluateExpression] in combination with the provided parameters. func (v *Value) Evaluate(parameters govaluate.MapParameters, funcs map[string]govaluate.ExpressionFunction, ) (float64, error) { if v == nil { return 0, nil } expression, err := govaluate.NewEvaluableExpressionWithFunctions(string(*v), funcs) if err != nil { return 0, fmt.Errorf("create new evaluable expression for %q: %w", *v, err) } result, err := expression.Evaluate(parameters) if err != nil { return 0, fmt.Errorf("evaluable expression for %q: %w", *v, err) } f, ok := result.(float64) if !ok { return 0, fmt.Errorf("cast %v to float: %w", result, ErrNonFloatValue) } return f, nil }