label.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package autocomplete
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. // LabelFieldPrefix identifies a label key namespace for autocomplete fields.
  7. type LabelFieldPrefix string
  8. const (
  9. LabelPrefix LabelFieldPrefix = "label"
  10. NamespaceLabelPrefix LabelFieldPrefix = "namespacelabel"
  11. )
  12. // LabelFieldKind describes how an autocomplete field relates to labels.
  13. type LabelFieldKind int
  14. const (
  15. LabelFieldNone LabelFieldKind = iota
  16. LabelFieldKeys
  17. LabelFieldValue
  18. )
  19. // ParseLabelField classifies field relative to prefix (e.g. label, label:app).
  20. func ParseLabelField(field string, prefix LabelFieldPrefix) (LabelFieldKind, string, error) {
  21. if field == "" {
  22. return LabelFieldNone, "", fmt.Errorf("field is required")
  23. }
  24. p := string(prefix)
  25. f := strings.ToLower(field)
  26. if f == p {
  27. return LabelFieldKeys, "", nil
  28. }
  29. valuePrefix := p + ":"
  30. if strings.HasPrefix(f, valuePrefix) {
  31. _, labelKey, _ := strings.Cut(field, ":")
  32. return LabelFieldValue, labelKey, nil
  33. }
  34. return LabelFieldNone, "", nil
  35. }
  36. // FormatLabelValueField returns a normalized label:value field preserving key casing.
  37. func FormatLabelValueField(prefix LabelFieldPrefix, labelKey string) string {
  38. return string(prefix) + ":" + labelKey
  39. }