github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/mkarray/array_num.go (about) 1 package mkarray 2 3 import ( 4 "regexp" 5 "strconv" 6 7 "github.com/lmorg/murex/lang" 8 "github.com/lmorg/murex/lang/types" 9 ) 10 11 // var rxIsNumberArray = regexp.MustCompile(`^\[([0-9]+)..([0-9]+)\]$`) 12 var rxIsNumberArray = regexp.MustCompile(`^\[([0-9]+..[0-9]+|[0-9]+|,)+\]$`) 13 14 func (a *arrayT) isNumberArray() (bool, error) { 15 var err error 16 17 // these data types are all strings anyway. So no point making them numeric 18 if a.dataType == types.String || a.dataType == types.Generic { 19 return false, nil 20 } 21 22 if !rxIsNumberArray.Match(a.expression) { 23 return false, nil 24 } 25 26 err = a.parseExpression() 27 if err != nil { 28 return false, err 29 } 30 31 if len(a.groups) != 1 { 32 return false, nil 33 } 34 35 return a.writeArrayNumber() 36 } 37 38 func (a *arrayT) writeArrayNumber() (bool, error) { 39 var array []int 40 41 for n := range a.groups[0] { 42 if a.p.HasCancelled() { 43 goto cancelled 44 } 45 46 switch a.groups[0][n].Type { 47 case astTypeString: 48 if len(a.groups[0][n].Data) == 0 { 49 continue 50 } 51 if len(a.groups[0][n].Data) > 1 && a.groups[0][n].Data[0] == '0' { 52 // numbers prefixed with a zero should be a string 53 return false, nil 54 } 55 i, err := strconv.Atoi(string(a.groups[0][n].Data)) 56 if err != nil { 57 return false, err 58 } 59 array = append(array, i) 60 61 case astTypeRange: 62 v, isNum, err := rangeToArrayNumber(a.groups[0][n].Data) 63 if !isNum || err != nil { 64 return isNum, err 65 } 66 array = append(array, v...) 67 } 68 } 69 70 cancelled: 71 b, err := lang.MarshalData(a.p, a.dataType, array) 72 if err != nil { 73 return true, err 74 } 75 _, err = a.p.Stdout.Write(b) 76 return true, err 77 }