1package jsoniter
2
3import (
4	"bytes"
5	"io"
6)
7
8// RawMessage to make replace json with jsoniter
9type RawMessage []byte
10
11// Unmarshal adapts to json/encoding Unmarshal API
12//
13// Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v.
14// Refer to https://godoc.org/encoding/json#Unmarshal for more information
15func Unmarshal(data []byte, v interface{}) error {
16	return ConfigDefault.Unmarshal(data, v)
17}
18
19// UnmarshalFromString is a convenient method to read from string instead of []byte
20func UnmarshalFromString(str string, v interface{}) error {
21	return ConfigDefault.UnmarshalFromString(str, v)
22}
23
24// Get quick method to get value from deeply nested JSON structure
25func Get(data []byte, path ...interface{}) Any {
26	return ConfigDefault.Get(data, path...)
27}
28
29// Marshal adapts to json/encoding Marshal API
30//
31// Marshal returns the JSON encoding of v, adapts to json/encoding Marshal API
32// Refer to https://godoc.org/encoding/json#Marshal for more information
33func Marshal(v interface{}) ([]byte, error) {
34	return ConfigDefault.Marshal(v)
35}
36
37// MarshalIndent same as json.MarshalIndent. Prefix is not supported.
38func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {
39	return ConfigDefault.MarshalIndent(v, prefix, indent)
40}
41
42// MarshalToString convenient method to write as string instead of []byte
43func MarshalToString(v interface{}) (string, error) {
44	return ConfigDefault.MarshalToString(v)
45}
46
47// NewDecoder adapts to json/stream NewDecoder API.
48//
49// NewDecoder returns a new decoder that reads from r.
50//
51// Instead of a json/encoding Decoder, an Decoder is returned
52// Refer to https://godoc.org/encoding/json#NewDecoder for more information
53func NewDecoder(reader io.Reader) *Decoder {
54	return ConfigDefault.NewDecoder(reader)
55}
56
57// Decoder reads and decodes JSON values from an input stream.
58// Decoder provides identical APIs with json/stream Decoder (Token() and UseNumber() are in progress)
59type Decoder struct {
60	iter *Iterator
61}
62
63// Decode decode JSON into interface{}
64func (adapter *Decoder) Decode(obj interface{}) error {
65	if adapter.iter.head == adapter.iter.tail && adapter.iter.reader != nil {
66		if !adapter.iter.loadMore() {
67			return io.EOF
68		}
69	}
70	adapter.iter.ReadVal(obj)
71	err := adapter.iter.Error
72	if err == io.EOF {
73		return nil
74	}
75	return adapter.iter.Error
76}
77
78// More is there more?
79func (adapter *Decoder) More() bool {
80	iter := adapter.iter
81	if iter.Error != nil {
82		return false
83	}
84	c := iter.nextToken()
85	if c == 0 {
86		return false
87	}
88	iter.unreadByte()
89	return c != ']' && c != '}'
90}
91
92// Buffered remaining buffer
93func (adapter *Decoder) Buffered() io.Reader {
94	remaining := adapter.iter.buf[adapter.iter.head:adapter.iter.tail]
95	return bytes.NewReader(remaining)
96}
97
98// UseNumber causes the Decoder to unmarshal a number into an interface{} as a
99// Number instead of as a float64.
100func (adapter *Decoder) UseNumber() {
101	cfg := adapter.iter.cfg.configBeforeFrozen
102	cfg.UseNumber = true
103	adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)
104}
105
106// DisallowUnknownFields causes the Decoder to return an error when the destination
107// is a struct and the input contains object keys which do not match any
108// non-ignored, exported fields in the destination.
109func (adapter *Decoder) DisallowUnknownFields() {
110	cfg := adapter.iter.cfg.configBeforeFrozen
111	cfg.DisallowUnknownFields = true
112	adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)
113}
114
115// NewEncoder same as json.NewEncoder
116func NewEncoder(writer io.Writer) *Encoder {
117	return ConfigDefault.NewEncoder(writer)
118}
119
120// Encoder same as json.Encoder
121type Encoder struct {
122	stream *Stream
123}
124
125// Encode encode interface{} as JSON to io.Writer
126func (adapter *Encoder) Encode(val interface{}) error {
127	adapter.stream.WriteVal(val)
128	adapter.stream.WriteRaw("\n")
129	adapter.stream.Flush()
130	return adapter.stream.Error
131}
132
133// SetIndent set the indention. Prefix is not supported
134func (adapter *Encoder) SetIndent(prefix, indent string) {
135	config := adapter.stream.cfg.configBeforeFrozen
136	config.IndentionStep = len(indent)
137	adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)
138}
139
140// SetEscapeHTML escape html by default, set to false to disable
141func (adapter *Encoder) SetEscapeHTML(escapeHTML bool) {
142	config := adapter.stream.cfg.configBeforeFrozen
143	config.EscapeHTML = escapeHTML
144	adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)
145}
146
147// Valid reports whether data is a valid JSON encoding.
148func Valid(data []byte) bool {
149	return ConfigDefault.Valid(data)
150}
151