Key the repeated-item check on the string itself; marshal only objects
Tests / vet + fmt + tests (pull_request) Successful in 51s

This commit is contained in:
2026-09-02 12:59:12 +02:00
parent 00a6160aa4
commit 8cd603a2b1
+6 -2
View File
@@ -153,11 +153,15 @@ func compileChoice(items []any) (node, error) {
func checkNoRepeatedItem(items []any) error { func checkNoRepeatedItem(items []any) error {
seen := make(map[string]int, len(items)) seen := make(map[string]int, len(items))
for i, raw := range items { for i, raw := range items {
key, err := json.Marshal(raw) key, isString := raw.(string)
if !isString {
b, err := json.Marshal(raw)
if err != nil { if err != nil {
return err return err
} }
if j, dup := seen[string(key)]; dup { key = "\x00" + string(b)
}
if j, dup := seen[key]; dup {
if s, isString := raw.(string); isString { if s, isString := raw.(string); isString {
return fmt.Errorf("choice item %q is repeated; skew the odds with a weight instead: { \"format\": %q, \"weight\": 2 }", s, s) return fmt.Errorf("choice item %q is repeated; skew the odds with a weight instead: { \"format\": %q, \"weight\": 2 }", s, s)
} }