github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/lang/expressions/exp04.go (about) 1 package expressions 2 3 import ( 4 "fmt" 5 6 "github.com/lmorg/murex/lang/expressions/primitives" 7 "github.com/lmorg/murex/lang/expressions/symbols" 8 "github.com/lmorg/murex/utils/alter" 9 ) 10 11 func expAdd(tree *ParserT) error { 12 leftNode, rightNode, err := tree.getLeftAndRightSymbols() 13 if err != nil { 14 return err 15 } 16 17 lv, rv, err := validateNumericalDataTypes(tree, leftNode, rightNode, tree.currentSymbol()) 18 if err != nil { 19 return err 20 } 21 22 return tree.foldAst(&astNodeT{ 23 key: symbols.Number, 24 pos: tree.ast[tree.astPos].pos, 25 dt: primitives.NewPrimitive(primitives.Number, lv+rv), 26 }) 27 } 28 29 func expSubtract(tree *ParserT) error { 30 left, right, err := tree.getLeftAndRightSymbols() 31 if err != nil { 32 return err 33 } 34 35 lv, rv, err := validateNumericalDataTypes(tree, left, right, tree.currentSymbol()) 36 if err != nil { 37 return err 38 } 39 40 return tree.foldAst(&astNodeT{ 41 key: symbols.Number, 42 pos: tree.ast[tree.astPos].pos, 43 dt: primitives.NewPrimitive(primitives.Number, lv-rv), 44 }) 45 } 46 47 func expMergeInto(tree *ParserT) error { 48 leftNode, rightNode, err := tree.getLeftAndRightSymbols() 49 if err != nil { 50 return err 51 } 52 53 left, err := leftNode.dt.GetValue() 54 if err != nil { 55 return err 56 } 57 right, err := rightNode.dt.GetValue() 58 if err != nil { 59 return err 60 } 61 62 merged, err := alter.Merge(tree.p.Context, right.Value, nil, left.Value) 63 if err != nil { 64 return raiseError(tree.expression, leftNode, 0, fmt.Sprintf( 65 "cannot perform merge '%s' into '%s': %s", 66 right.Value, left.Value, 67 err.Error())) 68 } 69 70 return tree.foldAst(&astNodeT{ 71 key: symbols.Calculated, 72 pos: tree.ast[tree.astPos].pos, 73 dt: primitives.NewScalar(right.DataType, merged), 74 }) 75 }