61 lines
1.4 KiB
Go
61 lines
1.4 KiB
Go
package config
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// ParseChecklistValue parses a checklist argument wire value.
|
|
// New values are JSON arrays; legacy comma-separated values are still accepted.
|
|
func ParseChecklistValue(value string) ([]string, error) {
|
|
trimmed := strings.TrimSpace(value)
|
|
if trimmed == "" {
|
|
return nil, nil
|
|
}
|
|
|
|
if strings.HasPrefix(trimmed, "[") {
|
|
return parseJSONChecklistValue(trimmed)
|
|
}
|
|
|
|
return parseLegacyChecklistValue(value)
|
|
}
|
|
|
|
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)
|
|
}
|
|
|
|
return values, nil
|
|
}
|
|
|
|
func parseLegacyChecklistValue(value string) ([]string, error) {
|
|
segments := strings.Split(value, ",")
|
|
values := make([]string, 0, len(segments))
|
|
for _, segment := range segments {
|
|
trimmedSegment := strings.TrimSpace(segment)
|
|
if trimmedSegment == "" {
|
|
return nil, fmt.Errorf("checklist value contains an empty segment")
|
|
}
|
|
|
|
values = append(values, trimmedSegment)
|
|
}
|
|
|
|
return values, nil
|
|
}
|
|
|
|
// FormatChecklistValue serializes selected checklist values for API transport.
|
|
func FormatChecklistValue(values []string) string {
|
|
if len(values) == 0 {
|
|
return ""
|
|
}
|
|
|
|
encoded, err := json.Marshal(values)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
|
|
return string(encoded)
|
|
}
|