init commit
This commit is contained in:
97
lazy.go
Normal file
97
lazy.go
Normal file
@@ -0,0 +1,97 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user