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 }