forked from ebhomengo/niki
1
0
Fork 0
niki/vendor/github.com/brianvoe/gofakeit/v6/fakeable.go

145 lines
2.5 KiB
Go
Raw Normal View History

2024-04-26 19:30:35 +00:00
package gofakeit
import (
"errors"
"fmt"
"reflect"
)
// Fakeable is an interface that can be implemented by a type to provide a custom fake value.
2024-04-26 19:30:35 +00:00
type Fakeable interface {
2024-04-26 19:30:35 +00:00
// Fake returns a fake value for the type.
2024-04-26 19:30:35 +00:00
Fake(faker *Faker) (any, error)
}
func isFakeable(t reflect.Type) bool {
2024-04-26 19:30:35 +00:00
fakeableTyp := reflect.TypeOf((*Fakeable)(nil)).Elem()
return t.Implements(fakeableTyp) || reflect.PtrTo(t).Implements(fakeableTyp)
2024-04-26 19:30:35 +00:00
}
func callFake(faker *Faker, v reflect.Value, possibleKinds ...reflect.Kind) (any, error) {
2024-04-26 19:30:35 +00:00
f, ok := v.Addr().Interface().(Fakeable)
2024-04-26 19:30:35 +00:00
if !ok {
2024-04-26 19:30:35 +00:00
return nil, errors.New("not a Fakeable type")
2024-04-26 19:30:35 +00:00
}
fakedValue, err := f.Fake(faker)
2024-04-26 19:30:35 +00:00
if err != nil {
2024-04-26 19:30:35 +00:00
return nil, fmt.Errorf("error calling Fake: %w", err)
2024-04-26 19:30:35 +00:00
}
2024-04-26 19:30:35 +00:00
k := reflect.TypeOf(fakedValue).Kind()
2024-04-26 19:30:35 +00:00
if !containsKind(possibleKinds, k) {
2024-04-26 19:30:35 +00:00
return nil, fmt.Errorf("returned value kind %q is not amongst the valid ones: %v", k, possibleKinds)
2024-04-26 19:30:35 +00:00
}
switch k {
2024-04-26 19:30:35 +00:00
case reflect.String:
2024-04-26 19:30:35 +00:00
return reflect.ValueOf(fakedValue).String(), nil
2024-04-26 19:30:35 +00:00
case reflect.Bool:
2024-04-26 19:30:35 +00:00
return reflect.ValueOf(fakedValue).Bool(), nil
2024-04-26 19:30:35 +00:00
case reflect.Int:
2024-04-26 19:30:35 +00:00
return int(reflect.ValueOf(fakedValue).Int()), nil
2024-04-26 19:30:35 +00:00
case reflect.Int8:
2024-04-26 19:30:35 +00:00
return int8(reflect.ValueOf(fakedValue).Int()), nil
2024-04-26 19:30:35 +00:00
case reflect.Int16:
2024-04-26 19:30:35 +00:00
return int16(reflect.ValueOf(fakedValue).Int()), nil
2024-04-26 19:30:35 +00:00
case reflect.Int32:
2024-04-26 19:30:35 +00:00
return int32(reflect.ValueOf(fakedValue).Int()), nil
2024-04-26 19:30:35 +00:00
case reflect.Int64:
2024-04-26 19:30:35 +00:00
return int64(reflect.ValueOf(fakedValue).Int()), nil
2024-04-26 19:30:35 +00:00
case reflect.Uint:
2024-04-26 19:30:35 +00:00
return uint(reflect.ValueOf(fakedValue).Uint()), nil
2024-04-26 19:30:35 +00:00
case reflect.Uint8:
2024-04-26 19:30:35 +00:00
return uint8(reflect.ValueOf(fakedValue).Uint()), nil
2024-04-26 19:30:35 +00:00
case reflect.Uint16:
2024-04-26 19:30:35 +00:00
return uint16(reflect.ValueOf(fakedValue).Uint()), nil
2024-04-26 19:30:35 +00:00
case reflect.Uint32:
2024-04-26 19:30:35 +00:00
return uint32(reflect.ValueOf(fakedValue).Uint()), nil
2024-04-26 19:30:35 +00:00
case reflect.Uint64:
2024-04-26 19:30:35 +00:00
return uint64(reflect.ValueOf(fakedValue).Uint()), nil
2024-04-26 19:30:35 +00:00
case reflect.Float32:
2024-04-26 19:30:35 +00:00
return float32(reflect.ValueOf(fakedValue).Float()), nil
2024-04-26 19:30:35 +00:00
case reflect.Float64:
2024-04-26 19:30:35 +00:00
return float64(reflect.ValueOf(fakedValue).Float()), nil
2024-04-26 19:30:35 +00:00
case reflect.Slice:
2024-04-26 19:30:35 +00:00
return reflect.ValueOf(fakedValue).Interface(), nil
2024-04-26 19:30:35 +00:00
case reflect.Map:
2024-04-26 19:30:35 +00:00
return reflect.ValueOf(fakedValue).Interface(), nil
2024-04-26 19:30:35 +00:00
case reflect.Struct:
2024-04-26 19:30:35 +00:00
return reflect.ValueOf(fakedValue).Interface(), nil
2024-04-26 19:30:35 +00:00
default:
2024-04-26 19:30:35 +00:00
return nil, fmt.Errorf("unsupported type %q", k)
2024-04-26 19:30:35 +00:00
}
2024-04-26 19:30:35 +00:00
}
func containsKind(possibleKinds []reflect.Kind, kind reflect.Kind) bool {
2024-04-26 19:30:35 +00:00
for _, k := range possibleKinds {
2024-04-26 19:30:35 +00:00
if k == kind {
2024-04-26 19:30:35 +00:00
return true
2024-04-26 19:30:35 +00:00
}
2024-04-26 19:30:35 +00:00
}
2024-04-26 19:30:35 +00:00
return false
2024-04-26 19:30:35 +00:00
}