56 lines
1.3 KiB
Go
56 lines
1.3 KiB
Go
package config
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// ParseChecklistValue parses a checklist argument wire value.
|
|
// Values must be JSON arrays, or a single choice without commas.
|
|
func ParseChecklistValue(value string) ([]string, error) {
|
|
trimmed := strings.TrimSpace(value)
|
|
if trimmed == "" {
|
|
return nil, nil
|
|
}
|
|
|
|
if strings.HasPrefix(trimmed, "[") {
|
|
return parseJSONChecklistValue(trimmed)
|
|
}
|
|
|
|
if strings.Contains(trimmed, ",") {
|
|
return nil, fmt.Errorf("checklist value uses legacy comma-separated format; use a JSON array instead")
|
|
}
|
|
|
|
return []string{trimmed}, nil
|
|
}
|
|
|
|
func parseJSONChecklistValue(value string) ([]string, error) {
|
|
var values []string
|
|
if err := json.Unmarshal([]byte(value), &values); err != nil {
|
|
return nil, fmt.Errorf("invalid checklist JSON value: %w", err)
|
|
}
|
|
|
|
for _, segment := range values {
|
|
if strings.TrimSpace(segment) == "" {
|
|
return nil, fmt.Errorf("checklist value contains an empty segment")
|
|
}
|
|
}
|
|
|
|
return values, nil
|
|
}
|
|
|
|
// FormatChecklistValue serializes selected checklist values for API transport.
|
|
func FormatChecklistValue(values []string) (string, error) {
|
|
if len(values) == 0 {
|
|
return "", nil
|
|
}
|
|
|
|
encoded, err := json.Marshal(values)
|
|
if err != nil {
|
|
return "", fmt.Errorf("encoding checklist value: %w", err)
|
|
}
|
|
|
|
return string(encoded), nil
|
|
}
|