func()

in pkg/prompb/iterator.go [153:233]


func (i *Iterator) parseLabels(ts *TimeSeries, line string) (*TimeSeries, string, error) {
	orig := line
	line = trimSpacePrefix(line)
	if len(line) == 0 {
		return nil, "", nil
	}

	if line[0] == '{' {
		line = line[1:]
		for len(line) > 0 {
			if line[0] == '}' {
				return ts, line[1:], nil
			}

			var idx = -1
			for i := 0; i < len(line); i++ {
				if line[i] == '=' {
					idx = i
					break
				}
			}
			if idx == -1 {
				return nil, "", fmt.Errorf("invalid label: no =: %s", orig)
			}

			key := line[:idx]
			if len(key) == 0 {
				return nil, "", fmt.Errorf("invalid label: no key: %s", orig)
			}

			line = line[idx+1:]
			if len(line) == 0 {
				return nil, "", fmt.Errorf("invalid label: no opening \": %s", orig)
			}
			if line[0] == '"' {
				line = line[1:]
			}

			value := i.buf[:0]
			var j int
			for j < len(line) {
				if line[j] == '\\' {
					switch line[j+1] {
					case '\\':
						value = append(value, '\\')
					case '"':
						value = append(value, '"')
					case 'n':
						value = append(value, '\n')
					default:
						value = append(value, '\\', line[j])
					}
					j += 2
					continue
				}

				if line[j] == '"' {
					line = line[j+1:]
					break
				}
				value = append(value, line[j])
				j += 1
			}

			ts.AppendLabel([]byte(key), value)

			if len(line) == 0 {
				return nil, "", fmt.Errorf("invalid labels: no closing }: %s", orig)
			}

			if line[0] == '}' {
				return ts, line[1:], nil
			}

			if line[0] == ',' {
				line = line[1:]
			}
		}
	}
	return ts, line, nil
}