github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/expressions/expressions.go (about)

     1  package expressions
     2  
     3  import (
     4  	"github.com/lmorg/murex/lang"
     5  	"github.com/lmorg/murex/lang/expressions"
     6  	"github.com/lmorg/murex/lang/types"
     7  )
     8  
     9  func init() {
    10  	lang.DefineFunction(lang.ExpressionFunctionName, cmdExpressions, types.Any)
    11  }
    12  
    13  func cmdExpressions(p *lang.Process) error {
    14  	expression := []rune(p.Parameters.StringAll())
    15  
    16  	result, err := expressions.ExecuteExpr(p, expression)
    17  	if err != nil {
    18  		return err
    19  	}
    20  
    21  	val, err := result.GetValue()
    22  	if err != nil {
    23  		return err
    24  	}
    25  
    26  	p.Stdout.SetDataType(val.DataType)
    27  
    28  	if val.Value == nil && val.DataType == types.Json {
    29  		_, err = p.Stdout.Write([]byte{'n', 'u', 'l', 'l'})
    30  		return err
    31  	}
    32  
    33  	var b []byte
    34  
    35  	switch val.Value.(type) {
    36  	case string:
    37  		b = []byte(val.Value.(string))
    38  	default:
    39  		b, err = lang.MarshalData(p, val.DataType, val.Value)
    40  		if err != nil {
    41  			return err
    42  		}
    43  	}
    44  
    45  	if val.DataType == types.Boolean {
    46  		if !types.IsTrue(b, 0) {
    47  			p.ExitNum = 1
    48  		}
    49  		if p.Next.OperatorLogicAnd || p.Next.OperatorLogicOr {
    50  			return nil
    51  		}
    52  	}
    53  
    54  	_, err = p.Stdout.Write(b)
    55  	return err
    56  }