json, reflect added
This commit is contained in:
		
							parent
							
								
									d2c462dc6a
								
							
						
					
					
						commit
						01cc315e25
					
				
							
								
								
									
										54
									
								
								encoding/json/json.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								encoding/json/json.go
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										14
									
								
								encoding/json/number.go
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										1153
									
								
								reflect/convert.go
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										41
									
								
								reflect/error.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								reflect/error.go
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										31
									
								
								reflect/indirect.go
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										35
									
								
								reflect/kind.go
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										72
									
								
								reflect/type.go
									
									
									
									
									
										Normal 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() {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user