|
|
@@ -0,0 +1,53 @@
|
|
|
+package jsoniter
|
|
|
+
|
|
|
+import (
|
|
|
+ "reflect"
|
|
|
+ "errors"
|
|
|
+)
|
|
|
+
|
|
|
+type Decoder interface {
|
|
|
+ decode(iter *Iterator, obj interface{})
|
|
|
+}
|
|
|
+
|
|
|
+type stringDecoder struct {
|
|
|
+}
|
|
|
+
|
|
|
+func (decoder *stringDecoder) decode(iter *Iterator, obj interface{}) {
|
|
|
+ ptr := obj.(*string)
|
|
|
+ *ptr = iter.ReadString()
|
|
|
+}
|
|
|
+
|
|
|
+var DECODER_STRING *stringDecoder
|
|
|
+
|
|
|
+func init() {
|
|
|
+ DECODER_STRING = &stringDecoder{}
|
|
|
+}
|
|
|
+
|
|
|
+func (iter *Iterator) Read(obj interface{}) {
|
|
|
+ type_ := reflect.TypeOf(obj)
|
|
|
+ decoder, err := decoderOfType(type_)
|
|
|
+ if err != nil {
|
|
|
+ iter.Error = err
|
|
|
+ return
|
|
|
+ }
|
|
|
+ decoder.decode(iter, obj)
|
|
|
+}
|
|
|
+
|
|
|
+func decoderOfType(type_ reflect.Type) (Decoder, error) {
|
|
|
+ switch type_.Kind() {
|
|
|
+ case reflect.Ptr:
|
|
|
+ return decoderOfPtr(type_.Elem())
|
|
|
+ default:
|
|
|
+ return nil, errors.New("expect ptr")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func decoderOfPtr(type_ reflect.Type) (Decoder, error) {
|
|
|
+ switch type_.Kind() {
|
|
|
+ case reflect.String:
|
|
|
+ return DECODER_STRING, nil
|
|
|
+ default:
|
|
|
+ return nil, errors.New("expect string")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|