| 636 | } |
| 637 | |
| 638 | func expandValues(values ...any) (results []any) { |
| 639 | appendToResult := func(rv reflect.Value) { |
| 640 | // unwrap interface |
| 641 | if rv.IsValid() && rv.Kind() == reflect.Interface { |
| 642 | rv = rv.Elem() |
| 643 | } |
| 644 | if rv.IsValid() && rv.Kind() == reflect.Struct { |
| 645 | p := reflect.New(rv.Type()) |
| 646 | p.Elem().Set(rv) |
| 647 | results = append(results, p.Interface()) |
| 648 | } else if rv.IsValid() { |
| 649 | results = append(results, rv.Interface()) |
| 650 | } |
| 651 | } |
| 652 | |
| 653 | // Process each argument; if an argument is a slice/array, expand its elements |
| 654 | for _, value := range values { |
| 655 | rv := reflect.ValueOf(value) |
| 656 | if rv.Kind() == reflect.Slice || rv.Kind() == reflect.Array { |
| 657 | for i := 0; i < rv.Len(); i++ { |
| 658 | appendToResult(rv.Index(i)) |
| 659 | } |
| 660 | } else { |
| 661 | appendToResult(rv) |
| 662 | } |
| 663 | } |
| 664 | return |
| 665 | } |