From 6f2ea76232fc5226ef393d51d388f476fadd13ca Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Fri, 15 Oct 2021 21:36:16 -0700 Subject: [PATCH] First version of the hostlist public package --- pkg/hostlist/hostlist.go | 80 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 pkg/hostlist/hostlist.go diff --git a/pkg/hostlist/hostlist.go b/pkg/hostlist/hostlist.go new file mode 100644 index 00000000..3c821f87 --- /dev/null +++ b/pkg/hostlist/hostlist.go @@ -0,0 +1,80 @@ +package hostlist + +import ( + "fmt" + "strconv" + "strings" + "unicode" +) + +func toInt(i string) int { + ret, _ := strconv.Atoi(i) + return ret +} + +func isDigit(s string) bool { + r := []rune(s) + + for i := 0; i < len(r); i++ { + if !unicode.IsDigit(r[i]) { + return false + } + } + + return true +} + +func expand_iterate(list []string) ([]string, int) { + var ret []string + var count int + + for _, i := range list { + + bracketIndex1 := strings.Index(i, "[") + bracketIndex2 := strings.Index(i, "]") + + if bracketIndex1 >= 0 && bracketIndex1 < bracketIndex2 { + prefix := i[:bracketIndex1] + suffix := i[bracketIndex2+1:] + ranges := strings.Split(i[bracketIndex1+1:bracketIndex2], ",") + count++ + + for _, r := range ranges { + iterate := strings.Split(r, "-") + + if len(iterate) == 1 { + if !isDigit(iterate[0]) { + return ret, 0 + } else { + ret = append(ret, prefix+iterate[0]+suffix) + } + } else if len(iterate) == 2 { + if !isDigit(iterate[0]) || !isDigit(iterate[1]) { + return ret, 0 + } else { + sigfigures := len(iterate[0]) + for i := toInt(iterate[0]); i <= toInt(iterate[1]); i++ { + ret = append(ret, fmt.Sprintf(`%s%.`+fmt.Sprintf("%d", sigfigures)+`d%s`, prefix, i, suffix)) + } + } + } + } + } + } + return ret, count +} + +func Expand(list []string) []string { + ret := list + + for { + loop, count := expand_iterate(ret) + + if count == 0 { + break + } + ret = loop + } + + return ret +}