func SegmentPath()

in wstl1/mapping_engine/util/jsonutil/jsonutil.go [99:133]


func SegmentPath(path string) ([]string, error) {
	segs := make([]string, 0, 1)
	sb := strings.Builder{}

	var escaped, prevEscaped bool
	for i, c := range path {
		escaped = i > 0 && path[i-1] == '\\' && !prevEscaped
		delim := c == '.' && !escaped

		// Validation
		if !unicode.IsLetter(c) && !unicode.IsDigit(c) && !strings.Contains(`-*[]._\' `, string(c)) && !escaped {
			return nil, fmt.Errorf("invalid character %q", string(c))
		}
		if i > 0 && c == '.' && path[i-1] == '.' && !prevEscaped {
			return nil, fmt.Errorf("consecutive dots in path %s", path)
		}

		if (!delim && c != '\\') || escaped {
			sb.WriteRune(c)
		}

		if (delim || (i < len(path)-1 && path[i+1] == '[')) && sb.Len() > 0 {
			segs = append(segs, sb.String())
			sb.Reset()
		}

		prevEscaped = escaped
	}

	if sb.Len() > 0 {
		segs = append(segs, sb.String())
	}

	return segs, nil
}