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  }