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 }