| 67 | } |
| 68 | |
| 69 | func populateValue(v reflect.Value, r *Random) (reflect.Value, error) { |
| 70 | var err error |
| 71 | |
| 72 | // Handle some special cases |
| 73 | switch v.Type() { |
| 74 | case reflect.TypeOf(time.Time{}): |
| 75 | v.Set(reflect.ValueOf(r.Time())) |
| 76 | return v, nil |
| 77 | default: |
| 78 | // Go to Kind instead |
| 79 | } |
| 80 | |
| 81 | switch v.Kind() { |
| 82 | case reflect.Struct: |
| 83 | if err := PopulateStruct(v.Addr().Interface(), r); err != nil { |
| 84 | return v, err |
| 85 | } |
| 86 | case reflect.String: |
| 87 | v.SetString(r.String()) |
| 88 | case reflect.Bool: |
| 89 | v.SetBool(true) |
| 90 | case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: |
| 91 | v.SetInt(r.Int()) |
| 92 | case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: |
| 93 | v.SetUint(r.Uint()) |
| 94 | case reflect.Float32, reflect.Float64: |
| 95 | v.SetFloat(r.Float()) |
| 96 | case reflect.Complex64, reflect.Complex128: |
| 97 | v.SetComplex(r.Complex()) |
| 98 | case reflect.Array: |
| 99 | for i := 0; i < v.Len(); i++ { |
| 100 | nv, err := populateValue(v.Index(i), r) |
| 101 | if err != nil { |
| 102 | return v, xerrors.Errorf("array index %d : %w", i, err) |
| 103 | } |
| 104 | v.Index(i).Set(nv) |
| 105 | } |
| 106 | case reflect.Map: |
| 107 | m := reflect.MakeMap(v.Type()) |
| 108 | |
| 109 | // Set a value in the map |
| 110 | k := reflect.New(v.Type().Key()) |
| 111 | kv := reflect.New(v.Type().Elem()) |
| 112 | k, err = populateValue(k, r) |
| 113 | if err != nil { |
| 114 | return v, xerrors.Errorf("map key : %w", err) |
| 115 | } |
| 116 | kv, err = populateValue(kv, r) |
| 117 | if err != nil { |
| 118 | return v, xerrors.Errorf("map value : %w", err) |
| 119 | } |
| 120 | |
| 121 | m.SetMapIndex(k, kv) |
| 122 | return m, nil |
| 123 | case reflect.Pointer: |
| 124 | return populateValue(v.Elem(), r) |
| 125 | case reflect.Slice: |
| 126 | s := reflect.MakeSlice(v.Type(), 2, 2) |