4
0

checklist.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package config
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strings"
  6. )
  7. // ParseChecklistValue parses a checklist argument wire value.
  8. // Values must be JSON arrays, or a single choice without commas.
  9. func ParseChecklistValue(value string) ([]string, error) {
  10. trimmed := strings.TrimSpace(value)
  11. if trimmed == "" {
  12. return nil, nil
  13. }
  14. if strings.HasPrefix(trimmed, "[") {
  15. return parseJSONChecklistValue(trimmed)
  16. }
  17. if strings.Contains(trimmed, ",") {
  18. return nil, fmt.Errorf("checklist value uses legacy comma-separated format; use a JSON array instead")
  19. }
  20. return []string{trimmed}, nil
  21. }
  22. func parseJSONChecklistValue(value string) ([]string, error) {
  23. var values []string
  24. if err := json.Unmarshal([]byte(value), &values); err != nil {
  25. return nil, fmt.Errorf("invalid checklist JSON value: %w", err)
  26. }
  27. for _, segment := range values {
  28. if strings.TrimSpace(segment) == "" {
  29. return nil, fmt.Errorf("checklist value contains an empty segment")
  30. }
  31. }
  32. return values, nil
  33. }
  34. // FormatChecklistValue serializes selected checklist values for API transport.
  35. func FormatChecklistValue(values []string) (string, error) {
  36. if len(values) == 0 {
  37. return "", nil
  38. }
  39. encoded, err := json.Marshal(values)
  40. if err != nil {
  41. return "", fmt.Errorf("encoding checklist value: %w", err)
  42. }
  43. return string(encoded), nil
  44. }