Browse Source

Add math functions for govaluate expressions

pull/6/head
Wouter Horlings 4 months ago
parent
commit
4d895f85f2
1 changed files with 33 additions and 2 deletions
  1. +33
    -2
      pkg/pattern/template/point.go

+ 33
- 2
pkg/pattern/template/point.go View File

@@ -3,6 +3,7 @@ package template
import (
"errors"
"fmt"
"maps"
"math"
"strconv"

@@ -40,7 +41,9 @@ type Point struct {
var ErrInvalidPointID = errors.New("type cannot be converted to a PointID")

func (p Points) Functions(pat *pattern.Pattern) map[string]govaluate.ExpressionFunction {
return map[string]govaluate.ExpressionFunction{
functions := p.evaluationFunctions()

maps.Copy(functions, map[string]govaluate.ExpressionFunction{
"DistanceBetween": func(args ...interface{}) (interface{}, error) {
if len(args) != 2 {
return nil, fmt.Errorf("function DistanceBetween() requires 2 arguments: %w",
@@ -66,7 +69,35 @@ func (p Points) Functions(pat *pattern.Pattern) map[string]govaluate.ExpressionF

return points[0].Vector().AngleBetween(points[1].Vector()), nil
},
}
"YDistanceBetween": func(args ...interface{}) (interface{}, error) {
if len(args) != 2 {
return nil, fmt.Errorf("function DistanceBetween() requires 2 arguments: %w",
ErrInvalidArguments)
}

points, err := p.getOrCreateFromArgs(pat, args...)
if err != nil {
return nil, err
}

return points[0].Vector().Y - points[1].Vector().Y, nil
},
"XDistanceBetween": func(args ...interface{}) (interface{}, error) {
if len(args) != 2 {
return nil, fmt.Errorf("function DistanceBetween() requires 2 arguments: %w",
ErrInvalidArguments)
}

points, err := p.getOrCreateFromArgs(pat, args...)
if err != nil {
return nil, err
}

return points[0].Vector().X - points[1].Vector().X, nil
},
})

return functions
}

func (p Points) getOrCreateFromArgs(pat *pattern.Pattern, args ...interface{}) ([]point.Point, error) {


Loading…
Cancel
Save