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 }