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  }