Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

41 linhas
1.0KB

  1. package template
  2. import (
  3. "errors"
  4. "fmt"
  5. "gopkg.in/Knetic/govaluate.v3"
  6. )
  7. // ErrNonFloatValue is returned when the result of the expression is not a float64.
  8. var ErrNonFloatValue = errors.New("failed to cast expression result for float64")
  9. // Value describes a measurement or dimension in the templates.
  10. type Value string
  11. // Evaluate a Value as [govaluate.EvaluateExpression] in combination with the provided parameters.
  12. func (v *Value) Evaluate(parameters govaluate.MapParameters,
  13. funcs map[string]govaluate.ExpressionFunction,
  14. ) (float64, error) {
  15. if v == nil {
  16. return 0, nil
  17. }
  18. expression, err := govaluate.NewEvaluableExpressionWithFunctions(string(*v), funcs)
  19. if err != nil {
  20. return 0, fmt.Errorf("create new evaluable expression for %q: %w", *v, err)
  21. }
  22. result, err := expression.Evaluate(parameters)
  23. if err != nil {
  24. return 0, fmt.Errorf("evaluable expression for %q: %w", *v, err)
  25. }
  26. f, ok := result.(float64)
  27. if !ok {
  28. return 0, fmt.Errorf("cast %v to float: %w", result, ErrNonFloatValue)
  29. }
  30. return f, nil
  31. }