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

     1  package jsonb
     2  
     3  import (
     4  	"encoding"
     5  	"encoding/json"
     6  	"reflect"
     7  
     8  	"github.com/RevenueMonster/sqlike/reflext"
     9  )
    10  
    11  // Marshaler :
    12  type Marshaler interface {
    13  	MarshalJSONB() ([]byte, error)
    14  }
    15  
    16  // Marshal :
    17  func Marshal(src interface{}) (b []byte, err error) {
    18  	v := reflext.ValueOf(src)
    19  	if src == nil || !v.IsValid() || reflext.IsNull(v) {
    20  		b = []byte(null)
    21  		return
    22  	}
    23  
    24  	encoder, err := registry.LookupEncoder(v)
    25  	if err != nil {
    26  		return nil, err
    27  	}
    28  
    29  	w := NewWriter()
    30  	if err := encoder(w, v); err != nil {
    31  		return nil, err
    32  	}
    33  	b = w.Bytes()
    34  	return
    35  }
    36  
    37  // marshalerEncoder
    38  func marshalerEncoder() ValueEncoder {
    39  	return func(w *Writer, v reflect.Value) error {
    40  		x := v.Interface().(Marshaler)
    41  		b, err := x.MarshalJSONB()
    42  		if err != nil {
    43  			return err
    44  		}
    45  		w.Write(b)
    46  		return nil
    47  	}
    48  }
    49  
    50  func jsonMarshalerEncoder() ValueEncoder {
    51  	return func(w *Writer, v reflect.Value) error {
    52  		x := v.Interface().(json.Marshaler)
    53  		b, err := x.MarshalJSON()
    54  		if err != nil {
    55  			return err
    56  		}
    57  		w.Write(b)
    58  		return nil
    59  	}
    60  }
    61  
    62  func textMarshalerEncoder() ValueEncoder {
    63  	return func(w *Writer, v reflect.Value) error {
    64  		x := v.Interface().(encoding.TextMarshaler)
    65  		b, err := x.MarshalText()
    66  		if err != nil {
    67  			return err
    68  		}
    69  		length := len(b)
    70  		w.WriteByte('"')
    71  		for i := 0; i < length; i++ {
    72  			char := b[0]
    73  			b = b[1:]
    74  			if x, ok := escapeCharMap[char]; ok {
    75  				w.Write(x)
    76  				continue
    77  			}
    78  			w.WriteByte(char)
    79  		}
    80  		w.WriteByte('"')
    81  		return nil
    82  	}
    83  }