json, reflect added

This commit is contained in:
crusader 2018-08-22 17:59:12 +09:00
parent d2c462dc6a
commit 01cc315e25
7 changed files with 1400 additions and 0 deletions

54
encoding/json/json.go Normal file
View File

@ -0,0 +1,54 @@
package json
import (
"encoding/json"
"fmt"
"reflect"
our "git.loafle.net/overflow/util-go/reflect"
)
// SetValueWithJSONStringArray set the value of json string array
// raw([]byte) is ["1", {"a": 1}, [1, 2]]
// targets([]interface{}) is array of pointer ex) *int, *string, *[], *map, *struct
func SetValueWithJSONStringArrayBytes(raw []byte, targets []interface{}) error {
var values []string
if err := json.Unmarshal(raw, &values); err != nil {
return err
}
return SetValueWithJSONStringArray(values, targets)
}
func SetValueWithJSONStringArray(values []string, targets []interface{}) error {
if len(targets) != len(values) {
return fmt.Errorf("Count of raw[%d] and targets[%d] is not same", len(values), len(targets))
}
for indexI := 0; indexI < len(values); indexI++ {
target := targets[indexI]
value := values[indexI]
if reflect.Ptr != reflect.TypeOf(target).Kind() {
return fmt.Errorf("Type of target[%d] must be ptr but is %s, value=%s", indexI, reflect.TypeOf(target).Kind(), value)
}
switch reflect.TypeOf(target).Elem().Kind() {
case reflect.Array, reflect.Slice, reflect.Map, reflect.Struct:
if err := json.Unmarshal([]byte(value), &target); nil != err {
return err
}
case reflect.Ptr:
return fmt.Errorf("Type of target[%d] cannot be double ptr, value=%s", indexI, value)
default:
cv, err := our.ConvertToType(value, reflect.TypeOf(target).Elem())
if nil != err {
return fmt.Errorf("Type conversion of value[%s] has been failed to %s[%d]", value, reflect.TypeOf(target).Elem().Kind(), indexI)
}
reflect.ValueOf(target).Elem().Set(reflect.ValueOf(cv))
}
}
return nil
}

14
encoding/json/number.go Normal file
View File

@ -0,0 +1,14 @@
package json
import (
"encoding/json"
"strconv"
)
func NumberToInt(n json.Number) (int, error) {
n64, err := strconv.ParseInt(n.String(), 10, 32)
if nil != err {
return 0, err
}
return int(n64), nil
}

1153
reflect/convert.go Normal file

File diff suppressed because it is too large Load Diff

41
reflect/error.go Normal file
View File

@ -0,0 +1,41 @@
package reflect
import (
"fmt"
"reflect"
"strings"
)
type ErrCanNotConvertType struct {
value interface{}
from reflect.Type
to reflect.Type
reason []string
}
func (e ErrCanNotConvertType) Error() string {
var (
reason = strings.Join(e.reason, ", ")
)
if reason != "" {
reason = ", reason: " + reason
}
return fmt.Sprintf(
"Can not convert '%#v' of type '%s' to '%s'%s",
e.value,
e.from,
e.to,
reason,
)
}
func NewErrCanNotConvertType(value interface{}, from reflect.Type, to reflect.Type, reason ...string) ErrCanNotConvertType {
return ErrCanNotConvertType{
value: value,
from: from,
to: to,
reason: reason,
}
}

31
reflect/indirect.go Normal file
View File

@ -0,0 +1,31 @@
package reflect
import (
"reflect"
)
func Indirect(v interface{}) interface{} {
if v == nil {
return nil
}
return IndirectValue(reflect.ValueOf(v)).Interface()
}
func IndirectValue(reflectValue reflect.Value) reflect.Value {
if reflectValue.Kind() == reflect.Ptr {
return reflectValue.Elem()
}
return reflectValue
}
func IndirectType(reflectType reflect.Type) reflect.Type {
if reflectType == TypeInvalid {
return TypeInvalid
}
if reflectType.Kind() == reflect.Ptr {
return reflectType.Elem()
}
return reflectType
}

35
reflect/kind.go Normal file
View File

@ -0,0 +1,35 @@
package reflect
import (
"reflect"
)
const (
Invalid = reflect.Invalid
Bool = reflect.Bool
Int = reflect.Int
Int8 = reflect.Int8
Int16 = reflect.Int16
Int32 = reflect.Int32
Int64 = reflect.Int64
Uint = reflect.Uint
Uint8 = reflect.Uint8
Uint16 = reflect.Uint16
Uint32 = reflect.Uint32
Uint64 = reflect.Uint64
Uintptr = reflect.Uintptr
Float32 = reflect.Float32
Float64 = reflect.Float64
Complex64 = reflect.Complex64
Complex128 = reflect.Complex128
Array = reflect.Array
Chan = reflect.Chan
Func = reflect.Func
Interface = reflect.Interface
Map = reflect.Map
Ptr = reflect.Ptr
Slice = reflect.Slice
String = reflect.String
Struct = reflect.Struct
UnsafePointer = reflect.UnsafePointer
)

72
reflect/type.go Normal file
View File

@ -0,0 +1,72 @@
package reflect
import (
"reflect"
)
var (
TypeOf = reflect.TypeOf
)
var (
Types = []reflect.Type{
TypeBool,
TypeInt,
TypeInt8,
TypeInt16,
TypeInt32,
TypeInt64,
TypeUint,
TypeUint8,
TypeUint16,
TypeUint32,
TypeUint64,
TypeFloat32,
TypeFloat64,
TypeComplex64,
TypeComplex128,
TypeUintptr,
TypeString,
}
TypeInvalid = reflect.Type(nil)
TypeBool = reflect.TypeOf(false)
TypeInt = reflect.TypeOf(int(0))
TypeInt8 = reflect.TypeOf(int8(0))
TypeInt16 = reflect.TypeOf(int16(0))
TypeInt32 = reflect.TypeOf(int32(0))
TypeInt64 = reflect.TypeOf(int64(0))
TypeUint = reflect.TypeOf(uint(0))
TypeUint8 = reflect.TypeOf(uint8(0))
TypeUint16 = reflect.TypeOf(uint16(0))
TypeUint32 = reflect.TypeOf(uint32(0))
TypeUint64 = reflect.TypeOf(uint64(0))
TypeFloat32 = reflect.TypeOf(float32(0))
TypeFloat64 = reflect.TypeOf(float64(0))
TypeComplex64 = reflect.TypeOf(complex64(0))
TypeComplex128 = reflect.TypeOf(complex128(0))
TypeUintptr = reflect.TypeOf(uintptr(0))
TypeString = reflect.TypeOf(string(""))
)
func IsTypeKind(t reflect.Type, kind reflect.Kind, removePtr bool) bool {
if reflect.Ptr == t.Kind() {
if removePtr {
return IsTypeKind(t.Elem(), kind, removePtr)
}
}
return kind == t.Kind()
}
func GetTypeInfo(t reflect.Type) (realType reflect.Type, pkgName string, name string) {
if reflect.Ptr == t.Kind() {
return GetTypeInfo(t.Elem())
}
return t, t.PkgPath(), t.Name()
}
func ConvertStringToType() {
}