FormatFieldSummary returns a formatted summary of item fields. Example output: "status: open | priority: high | category: platform"
(fieldsJSON string)
| 371 | // FormatFieldSummary returns a formatted summary of item fields. |
| 372 | // Example output: "status: open | priority: high | category: platform" |
| 373 | func FormatFieldSummary(fieldsJSON string) string { |
| 374 | if fieldsJSON == "" || fieldsJSON == "{}" || fieldsJSON == "null" { |
| 375 | return "" |
| 376 | } |
| 377 | |
| 378 | var fields map[string]any |
| 379 | if err := json.Unmarshal([]byte(fieldsJSON), &fields); err != nil { |
| 380 | return "" |
| 381 | } |
| 382 | |
| 383 | if len(fields) == 0 { |
| 384 | return "" |
| 385 | } |
| 386 | |
| 387 | // Sort keys for consistent output |
| 388 | keys := make([]string, 0, len(fields)) |
| 389 | for k := range fields { |
| 390 | keys = append(keys, k) |
| 391 | } |
| 392 | sort.Strings(keys) |
| 393 | |
| 394 | var parts []string |
| 395 | for _, k := range keys { |
| 396 | v := fields[k] |
| 397 | str := fmt.Sprintf("%v", v) |
| 398 | if str == "" || str == "<nil>" { |
| 399 | continue |
| 400 | } |
| 401 | // Colorize well-known fields |
| 402 | switch k { |
| 403 | case "status": |
| 404 | parts = append(parts, fmt.Sprintf("%s: %s", k, StatusColor(str).Sprint(str))) |
| 405 | case "priority": |
| 406 | parts = append(parts, fmt.Sprintf("%s: %s", k, PriorityColor(str).Sprint(str))) |
| 407 | default: |
| 408 | parts = append(parts, fmt.Sprintf("%s: %s", k, str)) |
| 409 | } |
| 410 | } |
| 411 | |
| 412 | if len(parts) == 0 { |
| 413 | return "" |
| 414 | } |
| 415 | |
| 416 | return strings.Join(parts, " | ") |
| 417 | } |
| 418 | |
| 419 | // PrintJSON prints any value as indented (human-readable) JSON. |
| 420 | func PrintJSON(v interface{}) error { |
no test coverage detected