nimo-shake/common/operator.go (56 lines of code) (raw):
package utils
import (
"strings"
)
func AppendStringList(input []string, list []*string) ([]string) {
for _, ele := range list {
input = append(input, *ele)
}
return input
}
func StringListToMap(input []string) map[string]struct{} {
mp := make(map[string]struct{}, len(input))
for _, ele := range input {
mp[ele] = struct{}{}
}
return mp
}
// @vinllen. see BulkError.Error. -1 means not found
func FindFirstErrorIndexAndMessage(error string) (int, string, bool) {
subIndex := "index["
subMsg := "msg["
subDup := "dup["
index := strings.Index(error, subIndex)
if index == -1 {
return index, "", false
}
indexVal := 0
for i := index + len(subIndex); i < len(error) && error[i] != ']'; i++ {
// fmt.Printf("%c %d\n", rune(error[i]), int(error[i] - '0'))
indexVal = indexVal * 10 + int(error[i] - '0')
}
index = strings.Index(error, subMsg)
if index == -1 {
return indexVal, "", false
}
i := index + len(subMsg)
stack := 0
for ; i < len(error); i++ {
if error[i] == ']' {
if stack == 0 {
break
} else {
stack -= 1
}
} else if error[i] == '[' {
stack += 1
}
}
msg := error[index + len(subMsg): i]
index = strings.Index(error, subDup)
if index == -1 {
return indexVal, msg, false
}
i = index + len(subMsg)
for ; i < len(error) && error[i] != ']'; i++ {}
dupVal := error[index + len(subMsg):i]
return indexVal, msg, dupVal == "true"
}