package lazy import ( "database/sql/driver" "errors" "fmt" "math/rand/v2" "reflect" "regexp" "github.com/jmoiron/sqlx" ) type MockResults struct { Query string Columns []string Rows []driver.Value } func GenerateRandomResults(query string, exampleObj any, keyVal any) (*MockResults, error) { if exampleObj == nil { return nil, errors.New("exampleObj cannot be nil") } retType := reflect.TypeOf(exampleObj) maxFieldCount := retType.NumField() columns := make([]string, 0, maxFieldCount) rows := make([]driver.Value, 0, maxFieldCount) for x := 0; x < maxFieldCount; x++ { field := retType.Field(x) dbTag := field.Tag.Get("db") if dbTag == "" { continue } columns = append(columns, dbTag) if field.Tag.Get("test") == "key" { rows = append(rows, keyVal) continue } nv := kindToRandom(field) if nv == nil { return nil, fmt.Errorf("could not match type: %s", retType.Name()) } rows = append(rows, nv) } return &MockResults{ Query: sqlx.Rebind(sqlx.AT, regexp.QuoteMeta(query)), Columns: columns, Rows: rows, }, nil } func kindToRandom(field reflect.StructField) any { kind := field.Type.Kind() switch kind { case reflect.Int: return rand.Int() case reflect.Int32: return rand.Int32() case reflect.Int64: return rand.Int64() case reflect.Float32: return rand.Float32() case reflect.Float64: return rand.Float64() case reflect.String: return fmt.Sprintf("%d", rand.Int()) case reflect.Bool: return rand.Int()%2 == 0 case reflect.Slice: underlying := field.Type.Elem().Kind() switch underlying { case reflect.Int: return []int{rand.Int()} case reflect.Int32: return []int32{rand.Int32()} case reflect.Int64: return []int64{rand.Int64()} case reflect.Float32: return []float32{rand.Float32()} case reflect.Float64: return []float64{rand.Float64()} case reflect.String: return []string{fmt.Sprintf("%d", rand.Int())} case reflect.Bool: return []bool{rand.Int()%2 == 0} } } return nil }