olivetin/service/internal/config/checklist.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
}