// Copyright 2023 The Xorm Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package convert import ( "fmt" "reflect" "strconv" ) func AsKind(vv reflect.Value, tp reflect.Type) (interface{}, error) { switch tp.Kind() { case reflect.Ptr: return AsKind(vv.Elem(), tp.Elem()) case reflect.Int64: return vv.Int(), nil case reflect.Int: return int(vv.Int()), nil case reflect.Int32: return int32(vv.Int()), nil case reflect.Int16: return int16(vv.Int()), nil case reflect.Int8: return int8(vv.Int()), nil case reflect.Uint64: return vv.Uint(), nil case reflect.Uint: return uint(vv.Uint()), nil case reflect.Uint32: return uint32(vv.Uint()), nil case reflect.Uint16: return uint16(vv.Uint()), nil case reflect.Uint8: return uint8(vv.Uint()), nil case reflect.String: return vv.String(), nil case reflect.Slice: if tp.Elem().Kind() == reflect.Uint8 { v, err := strconv.ParseInt(string(vv.Interface().([]byte)), 10, 64) if err != nil { return nil, err } return v, nil } } return nil, fmt.Errorf("unsupported primary key type: %v, %v", tp, vv) }