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

     1  package mkarray
     2  
     3  import (
     4  	"strings"
     5  )
     6  
     7  func (a *arrayT) isStringArray() (err error) {
     8  	a.writer, err = a.p.Stdout.WriteArray(a.dataType)
     9  	if err != nil {
    10  		return err
    11  	}
    12  
    13  	err = a.parseExpression()
    14  	if err != nil {
    15  		return err
    16  	}
    17  
    18  	return a.writeArrayString()
    19  }
    20  
    21  func (a *arrayT) writeArrayString() error {
    22  	var (
    23  		marker = string([]byte{0})
    24  		open   bool
    25  	)
    26  
    27  	for g := range a.groups {
    28  		var (
    29  			template string
    30  			variable = make(map[int][]string)
    31  			l        = -1
    32  		)
    33  
    34  		for n := range a.groups[g] {
    35  			if a.p.HasCancelled() {
    36  				goto cancelled
    37  			}
    38  
    39  			switch a.groups[g][n].Type {
    40  			case astTypeString:
    41  				if open {
    42  					variable[l] = append(variable[l], string(a.groups[g][n].Data))
    43  					continue
    44  				}
    45  				template += string(a.groups[g][n].Data)
    46  
    47  			case astTypeRange:
    48  				a, err := rangeToArrayString(a.groups[g][n].Data)
    49  				if err != nil {
    50  					return err
    51  				}
    52  				variable[l] = append(variable[l], a...)
    53  				continue
    54  
    55  			case astTypeOpen:
    56  				template += marker
    57  				l++
    58  				variable[l] = make([]string, 0)
    59  				open = true
    60  
    61  			case astTypeClose:
    62  				open = false
    63  			}
    64  		}
    65  
    66  		counter := make([]int, len(variable))
    67  
    68  		for {
    69  		nextIndex:
    70  			if a.p.HasCancelled() {
    71  				goto cancelled
    72  			}
    73  
    74  			s := template
    75  			for t := 0; t < len(counter); t++ {
    76  				c := counter[t]
    77  				s = strings.Replace(s, marker, variable[t][c], 1)
    78  			}
    79  			a.writer.WriteString(s)
    80  
    81  			i := len(counter) - 1
    82  			if i < 0 {
    83  				goto nextGroup
    84  			}
    85  
    86  			counter[i]++
    87  			if counter[i] == len(variable[i]) {
    88  			nextCounter:
    89  				counter[i] = 0
    90  				i--
    91  				if i < 0 {
    92  					goto nextGroup
    93  				}
    94  				counter[i]++
    95  				if counter[i] < len(variable[i]) {
    96  					goto nextIndex
    97  				} else {
    98  					goto nextCounter
    99  				}
   100  			} else {
   101  				goto nextIndex
   102  			}
   103  
   104  		}
   105  	nextGroup:
   106  	}
   107  
   108  cancelled:
   109  	return a.writer.Close()
   110  }