github.com/RevenueMonster/sqlike@v1.0.6/jsonb/decoder.go (about)

     1  package jsonb
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/base64"
     6  	"encoding/json"
     7  	"errors"
     8  	"fmt"
     9  	"reflect"
    10  	"regexp"
    11  	"strconv"
    12  	"time"
    13  
    14  	"github.com/RevenueMonster/sqlike/reflext"
    15  	"golang.org/x/text/currency"
    16  	"golang.org/x/text/language"
    17  )
    18  
    19  // date format :
    20  var (
    21  	ddmmyyyy       = regexp.MustCompile(`^\d{4}\-\d{2}\-\d{2}$`)
    22  	ddmmyyyyhhmmss = regexp.MustCompile(`^\d{4}\-\d{2}\-\d{2}\s\d{2}\:\d{2}:\d{2}$`)
    23  )
    24  
    25  // DefaultDecoder :
    26  type DefaultDecoder struct {
    27  	registry *Registry
    28  }
    29  
    30  // DecodeByte :
    31  func (dec DefaultDecoder) DecodeByte(r *Reader, v reflect.Value) error {
    32  	x, err := r.ReadRawString()
    33  	if err != nil {
    34  		return err
    35  	}
    36  	var b []byte
    37  	if x == null {
    38  		v.SetBytes(b)
    39  		return nil
    40  	} else if x == "" {
    41  		v.SetBytes(make([]byte, 0))
    42  		return nil
    43  	}
    44  	b, err = base64.StdEncoding.DecodeString(x)
    45  	if err != nil {
    46  		return err
    47  	}
    48  	v.SetBytes(b)
    49  	return nil
    50  }
    51  
    52  // DecodeLanguage :
    53  func (dec DefaultDecoder) DecodeLanguage(r *Reader, v reflect.Value) error {
    54  	str, err := r.ReadString()
    55  	if err != nil {
    56  		return err
    57  	}
    58  	if str == "" {
    59  		return nil
    60  	}
    61  	l, err := language.Parse(str)
    62  	if err != nil {
    63  		v.Set(reflect.ValueOf(language.Tag{}))
    64  		return err
    65  	}
    66  	v.Set(reflect.ValueOf(l))
    67  	return nil
    68  }
    69  
    70  // DecodeCurrency :
    71  func (dec DefaultDecoder) DecodeCurrency(r *Reader, v reflect.Value) error {
    72  	str, err := r.ReadString()
    73  	if err != nil {
    74  		return err
    75  	}
    76  	if str == "" {
    77  		v.Set(reflect.ValueOf(currency.Unit{}))
    78  		return nil
    79  	}
    80  	cur, err := currency.ParseISO(str)
    81  	if err != nil {
    82  		return err
    83  	}
    84  	v.Set(reflect.ValueOf(cur))
    85  	return nil
    86  }
    87  
    88  // DecodeTime :
    89  func (dec DefaultDecoder) DecodeTime(r *Reader, v reflect.Value) error {
    90  	b, err := r.ReadBytes()
    91  	if err != nil {
    92  		return err
    93  	}
    94  	str := string(b)
    95  	if str == null || str == `""` {
    96  		reflext.Set(v, reflect.ValueOf(time.Time{}))
    97  		return nil
    98  	}
    99  	if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
   100  		return errors.New("jsonb: invalid format of date")
   101  	}
   102  	str = string(b[1 : len(b)-1])
   103  	var x time.Time
   104  	x, err = DecodeTime(str)
   105  	if err != nil {
   106  		return err
   107  	}
   108  	v.Set(reflect.ValueOf(x))
   109  	return nil
   110  }
   111  
   112  // DecodeJSONRaw :
   113  func (dec DefaultDecoder) DecodeJSONRaw(r *Reader, v reflect.Value) error {
   114  	b := new(bytes.Buffer)
   115  	if err := json.Compact(b, r.Bytes()); err != nil {
   116  		return err
   117  	}
   118  	v.SetBytes(b.Bytes())
   119  	return nil
   120  }
   121  
   122  // DecodeJSONNumber :
   123  func (dec DefaultDecoder) DecodeJSONNumber(r *Reader, v reflect.Value) error {
   124  	x, err := r.ReadNumber()
   125  	if err != nil {
   126  		return err
   127  	}
   128  	v.SetString(x.String())
   129  	return nil
   130  }
   131  
   132  // DecodeString :
   133  func (dec DefaultDecoder) DecodeString(r *Reader, v reflect.Value) error {
   134  	x, err := r.ReadString()
   135  	if err != nil {
   136  		return err
   137  	}
   138  	v.SetString(x)
   139  	return nil
   140  }
   141  
   142  // DecodeBool :
   143  func (dec DefaultDecoder) DecodeBool(r *Reader, v reflect.Value) error {
   144  	x, err := r.ReadBoolean()
   145  	if err != nil {
   146  		return err
   147  	}
   148  	v.SetBool(x)
   149  	return nil
   150  }
   151  
   152  // DecodeInt :
   153  func (dec DefaultDecoder) DecodeInt(quote bool) ValueDecoder {
   154  	return func(r *Reader, v reflect.Value) error {
   155  		var (
   156  			str string
   157  			err error
   158  		)
   159  		if quote {
   160  			str, err = r.ReadString()
   161  			if err != nil {
   162  				return err
   163  			}
   164  		} else {
   165  			num, err := r.ReadNumber()
   166  			if err != nil {
   167  				return err
   168  			}
   169  			str = num.String()
   170  		}
   171  		x, err := strconv.ParseInt(str, 10, 64)
   172  		if err != nil {
   173  			return err
   174  		}
   175  		if v.OverflowInt(x) {
   176  			return errors.New("integer overflow")
   177  		}
   178  		v.SetInt(x)
   179  		return nil
   180  	}
   181  }
   182  
   183  // DecodeUint :
   184  func (dec DefaultDecoder) DecodeUint(quote bool) ValueDecoder {
   185  	return func(r *Reader, v reflect.Value) error {
   186  		var (
   187  			str string
   188  			err error
   189  		)
   190  		if quote {
   191  			str, err = r.ReadString()
   192  			if err != nil {
   193  				return err
   194  			}
   195  		} else {
   196  			num, err := r.ReadNumber()
   197  			if err != nil {
   198  				return err
   199  			}
   200  			str = num.String()
   201  		}
   202  		x, err := strconv.ParseUint(str, 10, 64)
   203  		if err != nil {
   204  			return err
   205  		}
   206  		if v.OverflowUint(x) {
   207  			return errors.New("unsigned integer overflow")
   208  		}
   209  		v.SetUint(x)
   210  		return nil
   211  	}
   212  }
   213  
   214  // DecodeFloat :
   215  func (dec DefaultDecoder) DecodeFloat(r *Reader, v reflect.Value) error {
   216  	num, err := r.ReadNumber()
   217  	if err != nil {
   218  		return err
   219  	}
   220  	x, err := strconv.ParseFloat(num.String(), 64)
   221  	if err != nil {
   222  		return err
   223  	}
   224  	if v.OverflowFloat(x) {
   225  		return errors.New("jsonb: float overflow")
   226  	}
   227  	v.SetFloat(x)
   228  	return nil
   229  }
   230  
   231  // DecodePtr :
   232  func (dec *DefaultDecoder) DecodePtr(r *Reader, v reflect.Value) error {
   233  	t := v.Type()
   234  	if r.IsNull() {
   235  		v.Set(reflect.Zero(t))
   236  		return r.skipNull()
   237  	}
   238  
   239  	t = t.Elem()
   240  	decoder, err := dec.registry.LookupDecoder(t)
   241  	if err != nil {
   242  		return err
   243  	}
   244  	vv := reflect.New(t)
   245  	if err := decoder(r, vv.Elem()); err != nil {
   246  		return err
   247  	}
   248  	v.Set(vv)
   249  	return nil
   250  }
   251  
   252  // DecodeStruct :
   253  func (dec *DefaultDecoder) DecodeStruct(r *Reader, v reflect.Value) error {
   254  	mapper := reflext.DefaultMapper
   255  	if r.IsNull() {
   256  		v.Set(reflect.Zero(v.Type()))
   257  		return r.skipNull()
   258  	}
   259  
   260  	return r.ReadObject(func(it *Reader, k string) error {
   261  		if it.IsNull() {
   262  			return nil
   263  		}
   264  
   265  		vv, exists := mapper.LookUpFieldByName(v, k)
   266  		if !exists {
   267  			return nil
   268  		}
   269  
   270  		decoder, err := dec.registry.LookupDecoder(vv.Type())
   271  		if err != nil {
   272  			return err
   273  		}
   274  
   275  		return decoder(it, vv)
   276  	})
   277  }
   278  
   279  // DecodeArray :
   280  func (dec *DefaultDecoder) DecodeArray(r *Reader, v reflect.Value) error {
   281  	t := v.Type()
   282  	if r.IsNull() {
   283  		v.Set(reflect.Zero(t))
   284  		return r.skipNull()
   285  	}
   286  
   287  	i, length := 0, v.Len()
   288  	t = t.Elem()
   289  	if err := r.ReadArray(func(it *Reader) error {
   290  		if i >= length {
   291  			return errors.New("jsonb: invalid array length")
   292  		}
   293  		vv := v.Index(i)
   294  		i++
   295  		decoder, err := dec.registry.LookupDecoder(t)
   296  		if err != nil {
   297  			return err
   298  		}
   299  		return decoder(it, vv)
   300  	}); err != nil {
   301  		return err
   302  	}
   303  	return nil
   304  }
   305  
   306  // DecodeSlice :
   307  func (dec *DefaultDecoder) DecodeSlice(r *Reader, v reflect.Value) error {
   308  	t := v.Type()
   309  	if r.IsNull() {
   310  		v.Set(reflect.Zero(t))
   311  		return r.skipNull()
   312  	}
   313  
   314  	v.Set(reflect.MakeSlice(t, 0, 0))
   315  	t = t.Elem()
   316  	return r.ReadArray(func(it *Reader) error {
   317  		v.Set(reflect.Append(v, reflext.Zero(t)))
   318  		vv := v.Index(v.Len() - 1)
   319  		decoder, err := dec.registry.LookupDecoder(t)
   320  		if err != nil {
   321  			return err
   322  		}
   323  		return decoder(it, vv)
   324  	})
   325  }
   326  
   327  // DecodeMap :
   328  func (dec *DefaultDecoder) DecodeMap(r *Reader, v reflect.Value) error {
   329  	if r.IsNull() {
   330  		v.Set(reflect.Zero(v.Type()))
   331  		return r.skipNull()
   332  	}
   333  
   334  	var (
   335  		decodeKey ValueDecoder
   336  		err       error
   337  		t         = v.Type()
   338  		kind      = t.Key().Kind()
   339  	)
   340  
   341  	switch kind {
   342  	case reflect.String:
   343  		decodeKey = dec.registry.kindDecoders[reflect.String]
   344  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
   345  		decodeKey = dec.DecodeInt(true)
   346  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
   347  		decodeKey = dec.DecodeUint(true)
   348  	default:
   349  		key := t.Key()
   350  		if key.Kind() != reflect.Ptr {
   351  			key = reflect.PtrTo(key)
   352  		}
   353  		// check if the map key is implements `encoding.TextUnmarshaler`
   354  		if !key.Implements(textUnmarshaler) {
   355  			return fmt.Errorf("jsonb: unsupported data type of map key, %q", t.Key().Kind())
   356  		}
   357  		decodeKey = textUnmarshalerDecoder()
   358  	}
   359  
   360  	decodeValue, err := dec.registry.LookupDecoder(t.Elem())
   361  	if err != nil {
   362  		return err
   363  	}
   364  	x := reflect.MakeMap(t)
   365  	if err := r.ReadObject(func(it *Reader, k string) error {
   366  		ki := reflext.Zero(t.Key())
   367  		err = decodeKey(NewReader([]byte(strconv.Quote(k))), ki)
   368  		if err != nil {
   369  			return err
   370  		}
   371  		vi := reflext.Zero(t.Elem())
   372  		err = decodeValue(it, vi)
   373  		if err != nil {
   374  			return err
   375  		}
   376  		x.SetMapIndex(ki, vi)
   377  		return nil
   378  	}); err != nil {
   379  		return err
   380  	}
   381  	v.Set(x)
   382  	return nil
   383  }
   384  
   385  // DecodeInterface :
   386  func (dec DefaultDecoder) DecodeInterface(r *Reader, v reflect.Value) error {
   387  	x, err := r.ReadValue()
   388  	if err != nil {
   389  		return err
   390  	}
   391  	if x != nil {
   392  		v.Set(reflect.ValueOf(x))
   393  	}
   394  	return nil
   395  }
   396  
   397  // DecodeTime :
   398  func DecodeTime(str string) (t time.Time, err error) {
   399  	switch {
   400  	case ddmmyyyy.MatchString(str):
   401  		t, err = time.Parse("2006-01-02", str)
   402  	case ddmmyyyyhhmmss.MatchString(str):
   403  		t, err = time.Parse("2006-01-02 15:04:05", str)
   404  	default:
   405  		t, err = time.Parse(time.RFC3339Nano, str)
   406  	}
   407  	return
   408  }