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

     1  package random
     2  
     3  import (
     4  	"errors"
     5  	"math/rand"
     6  
     7  	"github.com/lmorg/murex/lang"
     8  	"github.com/lmorg/murex/lang/types"
     9  )
    10  
    11  const funcName = "rand"
    12  
    13  func init() {
    14  	lang.DefineFunction(funcName, cmdRand, types.Any)
    15  }
    16  
    17  func cmdRand(p *lang.Process) error {
    18  	dt, err := p.Parameters.String(0)
    19  	if err != nil {
    20  		return err
    21  	}
    22  
    23  	p.Stdout.SetDataType(dt)
    24  	var v interface{}
    25  
    26  	switch dt {
    27  	case types.Integer, types.Number:
    28  		max, _ := p.Parameters.Int(1)
    29  		if max > 0 {
    30  			v = rand.Intn(max + 1)
    31  		} else {
    32  			v = rand.Int()
    33  		}
    34  
    35  	case types.Float:
    36  		v = rand.Float64()
    37  
    38  	case types.String, types.Generic:
    39  		max, _ := p.Parameters.Int(1)
    40  		if max < 1 {
    41  			max = 20
    42  		}
    43  
    44  		a := make([]rune, max)
    45  		for i := 0; i < max; i++ {
    46  			a[i] = rune(rand.Intn(126-31) + 32)
    47  		}
    48  		v = string(a)
    49  
    50  	default:
    51  		return errors.New("I don't know how to generate random data for the data type `" + dt + "`")
    52  	}
    53  
    54  	s, err := types.ConvertGoType(v, types.String)
    55  	if err != nil {
    56  		return err
    57  	}
    58  
    59  	_, err = p.Stdout.Write([]byte(s.(string)))
    60  	return err
    61  }