(parsed map[string]any, usage map[string]any, keys ...string)
| 563 | } |
| 564 | |
| 565 | func usageNumericValue(parsed map[string]any, usage map[string]any, keys ...string) float64 { |
| 566 | for _, key := range keys { |
| 567 | for _, candidate := range []any{usage[key], parsed[key]} { |
| 568 | switch v := candidate.(type) { |
| 569 | case float64: |
| 570 | if !isFinite(v) { |
| 571 | continue |
| 572 | } |
| 573 | return v |
| 574 | case json.Number: |
| 575 | if num, err := v.Float64(); err == nil && isFinite(num) { |
| 576 | return num |
| 577 | } |
| 578 | case int: |
| 579 | return float64(v) |
| 580 | case int64: |
| 581 | return float64(v) |
| 582 | case string: |
| 583 | if strings.TrimSpace(v) == "" { |
| 584 | continue |
| 585 | } |
| 586 | num := json.Number(v) |
| 587 | if parsedNum, err := num.Float64(); err == nil && isFinite(parsedNum) { |
| 588 | return parsedNum |
| 589 | } |
| 590 | } |
| 591 | } |
| 592 | } |
| 593 | return 0 |
| 594 | } |
| 595 | |
| 596 | func usageStringValue(parsed map[string]any, usage map[string]any, keys ...string) string { |
| 597 | for _, key := range keys { |
no test coverage detected