Added possibility to use typecasting values (a.e.: type XY int64)
This commit is contained in:
parent
c6fd661827
commit
f4c84c435f
64
marshal.go
64
marshal.go
|
@ -263,8 +263,58 @@ func encRegister(e interface{}) (err error) {
|
|||
return ret, nil
|
||||
}
|
||||
encoderCache[t.Name()] = f
|
||||
case reflect.Bool:
|
||||
f := func(e interface{}) (ret []byte, err error) {
|
||||
return marshalBaseType(bool(v.Bool()))
|
||||
}
|
||||
encoderCache[t.Name()] = f
|
||||
case reflect.Uint8:
|
||||
f := func(e interface{}) (ret []byte, err error) {
|
||||
return marshalBaseType(uint8(v.Uint()))
|
||||
}
|
||||
encoderCache[t.Name()] = f
|
||||
case reflect.Uint16:
|
||||
f := func(e interface{}) (ret []byte, err error) {
|
||||
return marshalBaseType(uint16(v.Uint()))
|
||||
}
|
||||
encoderCache[t.Name()] = f
|
||||
case reflect.Uint32:
|
||||
f := func(e interface{}) (ret []byte, err error) {
|
||||
return marshalBaseType(uint32(v.Uint()))
|
||||
}
|
||||
encoderCache[t.Name()] = f
|
||||
case reflect.Uint64:
|
||||
f := func(e interface{}) (ret []byte, err error) {
|
||||
return marshalBaseType(uint64(v.Uint()))
|
||||
}
|
||||
encoderCache[t.Name()] = f
|
||||
case reflect.Int8:
|
||||
f := func(e interface{}) (ret []byte, err error) {
|
||||
return marshalBaseType(int8(v.Uint()))
|
||||
}
|
||||
encoderCache[t.Name()] = f
|
||||
case reflect.Int16:
|
||||
f := func(e interface{}) (ret []byte, err error) {
|
||||
return marshalBaseType(int16(v.Uint()))
|
||||
}
|
||||
encoderCache[t.Name()] = f
|
||||
case reflect.Int32:
|
||||
f := func(e interface{}) (ret []byte, err error) {
|
||||
return marshalBaseType(int32(v.Uint()))
|
||||
}
|
||||
encoderCache[t.Name()] = f
|
||||
case reflect.Int64:
|
||||
f := func(e interface{}) (ret []byte, err error) {
|
||||
return marshalBaseType(int64(v.Uint()))
|
||||
}
|
||||
encoderCache[t.Name()] = f
|
||||
case reflect.String:
|
||||
f := func(e interface{}) (ret []byte, err error) {
|
||||
return marshalBaseType(string(v.String()))
|
||||
}
|
||||
encoderCache[t.Name()] = f
|
||||
default:
|
||||
return errors.New("ssob: Unknown type " + string(v.Kind()))
|
||||
return errors.New("ssob: Unknown type " + string(t.Name()))
|
||||
}
|
||||
|
||||
return nil
|
||||
|
@ -310,16 +360,18 @@ func marshal(e interface{}) (ret []byte, err error) {
|
|||
var key string
|
||||
t := reflect.TypeOf(e)
|
||||
v := reflect.ValueOf(e)
|
||||
if t.Kind() == reflect.Ptr {
|
||||
switch t.Kind() {
|
||||
case reflect.Ptr:
|
||||
if v.IsNil() {
|
||||
return nil, errors.New("ssob: Cannot marshal nil pointer")
|
||||
}
|
||||
p := reflect.Indirect(v)
|
||||
return marshal(p.Interface())
|
||||
}
|
||||
if t.Kind() == reflect.Struct {
|
||||
key = reflect.TypeOf(e).Name()
|
||||
} else {
|
||||
case reflect.Bool, reflect.Int8, reflect.Int16, reflect.Int32,
|
||||
reflect.Int64, reflect.Uint8, reflect.Uint16, reflect.Uint32,
|
||||
reflect.Uint64, reflect.String, reflect.Struct:
|
||||
key = t.Name()
|
||||
default:
|
||||
key = string(t.Kind())
|
||||
}
|
||||
|
||||
|
|
167
unmarshal.go
167
unmarshal.go
|
@ -331,6 +331,166 @@ func decRegister(e interface{}) (err error) {
|
|||
return pos, nil
|
||||
}
|
||||
decoderCache[string(t.Kind())] = f
|
||||
case reflect.Bool:
|
||||
f := func(e interface{}, in []byte) (n int, err error) {
|
||||
v := reflect.ValueOf(e)
|
||||
i := bool(false)
|
||||
pos := 0
|
||||
|
||||
r, err := unmarshalBaseType(&i, in[pos:])
|
||||
pos += r
|
||||
if err != nil {
|
||||
return pos, err
|
||||
}
|
||||
v.Elem().SetBool(bool(i))
|
||||
|
||||
return pos, nil
|
||||
}
|
||||
decoderCache[t.Name()] = f
|
||||
case reflect.Uint8:
|
||||
f := func(e interface{}, in []byte) (n int, err error) {
|
||||
v := reflect.ValueOf(e)
|
||||
i := uint8(0)
|
||||
pos := 0
|
||||
|
||||
r, err := unmarshalBaseType(&i, in[pos:])
|
||||
pos += r
|
||||
if err != nil {
|
||||
return pos, err
|
||||
}
|
||||
v.Elem().SetUint(uint64(i))
|
||||
|
||||
return pos, nil
|
||||
}
|
||||
decoderCache[t.Name()] = f
|
||||
case reflect.Uint16:
|
||||
f := func(e interface{}, in []byte) (n int, err error) {
|
||||
v := reflect.ValueOf(e)
|
||||
i := uint16(0)
|
||||
pos := 0
|
||||
|
||||
r, err := unmarshalBaseType(&i, in[pos:])
|
||||
pos += r
|
||||
if err != nil {
|
||||
return pos, err
|
||||
}
|
||||
v.Elem().SetUint(uint64(i))
|
||||
|
||||
return pos, nil
|
||||
}
|
||||
decoderCache[t.Name()] = f
|
||||
case reflect.Uint32:
|
||||
f := func(e interface{}, in []byte) (n int, err error) {
|
||||
v := reflect.ValueOf(e)
|
||||
i := uint32(0)
|
||||
pos := 0
|
||||
|
||||
r, err := unmarshalBaseType(&i, in[pos:])
|
||||
pos += r
|
||||
if err != nil {
|
||||
return pos, err
|
||||
}
|
||||
v.Elem().SetUint(uint64(i))
|
||||
|
||||
return pos, nil
|
||||
}
|
||||
decoderCache[t.Name()] = f
|
||||
case reflect.Uint64:
|
||||
f := func(e interface{}, in []byte) (n int, err error) {
|
||||
v := reflect.ValueOf(e)
|
||||
i := uint64(0)
|
||||
pos := 0
|
||||
|
||||
r, err := unmarshalBaseType(&i, in[pos:])
|
||||
pos += r
|
||||
if err != nil {
|
||||
return pos, err
|
||||
}
|
||||
v.Elem().SetUint(uint64(i))
|
||||
|
||||
return pos, nil
|
||||
}
|
||||
decoderCache[t.Name()] = f
|
||||
case reflect.Int8:
|
||||
f := func(e interface{}, in []byte) (n int, err error) {
|
||||
v := reflect.ValueOf(e)
|
||||
i := int8(0)
|
||||
pos := 0
|
||||
|
||||
r, err := unmarshalBaseType(&i, in[pos:])
|
||||
pos += r
|
||||
if err != nil {
|
||||
return pos, err
|
||||
}
|
||||
v.Elem().SetInt(int64(i))
|
||||
|
||||
return pos, nil
|
||||
}
|
||||
decoderCache[t.Name()] = f
|
||||
case reflect.Int16:
|
||||
f := func(e interface{}, in []byte) (n int, err error) {
|
||||
v := reflect.ValueOf(e)
|
||||
i := int16(0)
|
||||
pos := 0
|
||||
|
||||
r, err := unmarshalBaseType(&i, in[pos:])
|
||||
pos += r
|
||||
if err != nil {
|
||||
return pos, err
|
||||
}
|
||||
v.Elem().SetInt(int64(i))
|
||||
|
||||
return pos, nil
|
||||
}
|
||||
decoderCache[t.Name()] = f
|
||||
case reflect.Int32:
|
||||
f := func(e interface{}, in []byte) (n int, err error) {
|
||||
v := reflect.ValueOf(e)
|
||||
i := int32(0)
|
||||
pos := 0
|
||||
|
||||
r, err := unmarshalBaseType(&i, in[pos:])
|
||||
pos += r
|
||||
if err != nil {
|
||||
return pos, err
|
||||
}
|
||||
v.Elem().SetInt(int64(i))
|
||||
|
||||
return pos, nil
|
||||
}
|
||||
decoderCache[t.Name()] = f
|
||||
case reflect.Int64:
|
||||
f := func(e interface{}, in []byte) (n int, err error) {
|
||||
v := reflect.ValueOf(e)
|
||||
i := int64(0)
|
||||
pos := 0
|
||||
|
||||
r, err := unmarshalBaseType(&i, in[pos:])
|
||||
pos += r
|
||||
if err != nil {
|
||||
return pos, err
|
||||
}
|
||||
v.Elem().SetInt(int64(i))
|
||||
|
||||
return pos, nil
|
||||
}
|
||||
decoderCache[t.Name()] = f
|
||||
case reflect.String:
|
||||
f := func(e interface{}, in []byte) (n int, err error) {
|
||||
v := reflect.ValueOf(e)
|
||||
i := string("")
|
||||
pos := 0
|
||||
|
||||
r, err := unmarshalBaseType(&i, in[pos:])
|
||||
pos += r
|
||||
if err != nil {
|
||||
return pos, err
|
||||
}
|
||||
v.Elem().SetString(i)
|
||||
|
||||
return pos, nil
|
||||
}
|
||||
decoderCache[t.Name()] = f
|
||||
default:
|
||||
return errors.New("ssob: Unknown type " + string(v.Kind()))
|
||||
}
|
||||
|
@ -384,9 +544,12 @@ func unmarshal(e interface{}, in []byte) (n int, err error) {
|
|||
|
||||
p := reflect.Indirect(v)
|
||||
if p.Kind() != reflect.Ptr {
|
||||
if p.Kind() == reflect.Struct {
|
||||
switch p.Kind() {
|
||||
case reflect.Bool, reflect.Int8, reflect.Int16, reflect.Int32,
|
||||
reflect.Int64, reflect.Uint8, reflect.Uint16, reflect.Uint32,
|
||||
reflect.Uint64, reflect.String, reflect.Struct:
|
||||
key = reflect.TypeOf(p.Interface()).Name()
|
||||
} else {
|
||||
default:
|
||||
key = string(p.Kind())
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue