First version of the hostlist public package
This commit is contained in:
80
pkg/hostlist/hostlist.go
Normal file
80
pkg/hostlist/hostlist.go
Normal file
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user