github.com/anthropics/anthropic-sdk-go@v1.70.1/internal/encoding/json/stream.go (about)

     1  // Copyright 2010 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package json
     6  
     7  import (
     8  	"bytes"
     9  	"io"
    10  )
    11  
    12  // A Decoder reads and decodes JSON values from an input stream.
    13  type Decoder struct {
    14  	r       io.Reader
    15  	buf     []byte
    16  	d       decodeState
    17  	scanp   int   // start of unread data in buf
    18  	scanned int64 // amount of data already scanned
    19  	scan    scanner
    20  	err     error
    21  
    22  	tokenState int
    23  	tokenStack []int
    24  }
    25  
    26  // NewDecoder returns a new decoder that reads from r.
    27  //
    28  // The decoder introduces its own buffering and may
    29  // read data from r beyond the JSON values requested.
    30  func NewDecoder(r io.Reader) *Decoder {
    31  	return &Decoder{r: r}
    32  }
    33  
    34  // UseNumber causes the Decoder to unmarshal a number into an
    35  // interface value as a [Number] instead of as a float64.
    36  func (dec *Decoder) UseNumber() { dec.d.useNumber = true }
    37  
    38  // DisallowUnknownFields causes the Decoder to return an error when the destination
    39  // is a struct and the input contains object keys which do not match any
    40  // non-ignored, exported fields in the destination.
    41  func (dec *Decoder) DisallowUnknownFields() { dec.d.disallowUnknownFields = true }
    42  
    43  // Decode reads the next JSON-encoded value from its
    44  // input and stores it in the value pointed to by v.
    45  //
    46  // See the documentation for [Unmarshal] for details about
    47  // the conversion of JSON into a Go value.
    48  func (dec *Decoder) Decode(v any) error {
    49  	if dec.err != nil {
    50  		return dec.err
    51  	}
    52  
    53  	if err := dec.tokenPrepareForDecode(); err != nil {
    54  		return err
    55  	}
    56  
    57  	if !dec.tokenValueAllowed() {
    58  		return &SyntaxError{msg: "not at beginning of value", Offset: dec.InputOffset()}
    59  	}
    60  
    61  	// Read whole value into buffer.
    62  	n, err := dec.readValue()
    63  	if err != nil {
    64  		return err
    65  	}
    66  	dec.d.init(dec.buf[dec.scanp : dec.scanp+n])
    67  	dec.scanp += n
    68  
    69  	// Don't save err from unmarshal into dec.err:
    70  	// the connection is still usable since we read a complete JSON
    71  	// object from it before the error happened.
    72  	err = dec.d.unmarshal(v)
    73  
    74  	// fixup token streaming state
    75  	dec.tokenValueEnd()
    76  
    77  	return err
    78  }
    79  
    80  // Buffered returns a reader of the data remaining in the Decoder's
    81  // buffer. The reader is valid until the next call to [Decoder.Decode].
    82  func (dec *Decoder) Buffered() io.Reader {
    83  	return bytes.NewReader(dec.buf[dec.scanp:])
    84  }
    85  
    86  // readValue reads a JSON value into dec.buf.
    87  // It returns the length of the encoding.
    88  func (dec *Decoder) readValue() (int, error) {
    89  	dec.scan.reset()
    90  
    91  	scanp := dec.scanp
    92  	var err error
    93  Input:
    94  	// help the compiler see that scanp is never negative, so it can remove
    95  	// some bounds checks below.
    96  	for scanp >= 0 {
    97  
    98  		// Look in the buffer for a new value.
    99  		for ; scanp < len(dec.buf); scanp++ {
   100  			c := dec.buf[scanp]
   101  			dec.scan.bytes++
   102  			switch dec.scan.step(&dec.scan, c) {
   103  			case scanEnd:
   104  				// scanEnd is delayed one byte so we decrement
   105  				// the scanner bytes count by 1 to ensure that
   106  				// this value is correct in the next call of Decode.
   107  				dec.scan.bytes--
   108  				break Input
   109  			case scanEndObject, scanEndArray:
   110  				// scanEnd is delayed one byte.
   111  				// We might block trying to get that byte from src,
   112  				// so instead invent a space byte.
   113  				if stateEndValue(&dec.scan, ' ') == scanEnd {
   114  					scanp++
   115  					break Input
   116  				}
   117  			case scanError:
   118  				dec.err = dec.scan.err
   119  				return 0, dec.scan.err
   120  			}
   121  		}
   122  
   123  		// Did the last read have an error?
   124  		// Delayed until now to allow buffer scan.
   125  		if err != nil {
   126  			if err == io.EOF {
   127  				if dec.scan.step(&dec.scan, ' ') == scanEnd {
   128  					break Input
   129  				}
   130  				if nonSpace(dec.buf) {
   131  					err = io.ErrUnexpectedEOF
   132  				}
   133  			}
   134  			dec.err = err
   135  			return 0, err
   136  		}
   137  
   138  		n := scanp - dec.scanp
   139  		err = dec.refill()
   140  		scanp = dec.scanp + n
   141  	}
   142  	return scanp - dec.scanp, nil
   143  }
   144  
   145  func (dec *Decoder) refill() error {
   146  	// Make room to read more into the buffer.
   147  	// First slide down data already consumed.
   148  	if dec.scanp > 0 {
   149  		dec.scanned += int64(dec.scanp)
   150  		n := copy(dec.buf, dec.buf[dec.scanp:])
   151  		dec.buf = dec.buf[:n]
   152  		dec.scanp = 0
   153  	}
   154  
   155  	// Grow buffer if not large enough.
   156  	const minRead = 512
   157  	if cap(dec.buf)-len(dec.buf) < minRead {
   158  		newBuf := make([]byte, len(dec.buf), 2*cap(dec.buf)+minRead)
   159  		copy(newBuf, dec.buf)
   160  		dec.buf = newBuf
   161  	}
   162  
   163  	// Read. Delay error for next iteration (after scan).
   164  	n, err := dec.r.Read(dec.buf[len(dec.buf):cap(dec.buf)])
   165  	dec.buf = dec.buf[0 : len(dec.buf)+n]
   166  
   167  	return err
   168  }
   169  
   170  func nonSpace(b []byte) bool {
   171  	for _, c := range b {
   172  		if !isSpace(c) {
   173  			return true
   174  		}
   175  	}
   176  	return false
   177  }
   178  
   179  // An Encoder writes JSON values to an output stream.
   180  type Encoder struct {
   181  	w          io.Writer
   182  	err        error
   183  	escapeHTML bool
   184  
   185  	indentBuf    []byte
   186  	indentPrefix string
   187  	indentValue  string
   188  }
   189  
   190  // NewEncoder returns a new encoder that writes to w.
   191  func NewEncoder(w io.Writer) *Encoder {
   192  	return &Encoder{w: w, escapeHTML: true}
   193  }
   194  
   195  // Encode writes the JSON encoding of v to the stream,
   196  // with insignificant space characters elided,
   197  // followed by a newline character.
   198  //
   199  // See the documentation for [Marshal] for details about the
   200  // conversion of Go values to JSON.
   201  func (enc *Encoder) Encode(v any) error {
   202  	if enc.err != nil {
   203  		return enc.err
   204  	}
   205  
   206  	e := newEncodeState()
   207  	defer encodeStatePool.Put(e)
   208  
   209  	err := e.marshal(v, encOpts{escapeHTML: enc.escapeHTML})
   210  	if err != nil {
   211  		return err
   212  	}
   213  
   214  	// Terminate each value with a newline.
   215  	// This makes the output look a little nicer
   216  	// when debugging, and some kind of space
   217  	// is required if the encoded value was a number,
   218  	// so that the reader knows there aren't more
   219  	// digits coming.
   220  	e.WriteByte('\n')
   221  
   222  	b := e.Bytes()
   223  	if enc.indentPrefix != "" || enc.indentValue != "" {
   224  		enc.indentBuf, err = appendIndent(enc.indentBuf[:0], b, enc.indentPrefix, enc.indentValue)
   225  		if err != nil {
   226  			return err
   227  		}
   228  		b = enc.indentBuf
   229  	}
   230  	if _, err = enc.w.Write(b); err != nil {
   231  		enc.err = err
   232  	}
   233  	return err
   234  }
   235  
   236  // SetIndent instructs the encoder to format each subsequent encoded
   237  // value as if indented by the package-level function Indent(dst, src, prefix, indent).
   238  // Calling SetIndent("", "") disables indentation.
   239  func (enc *Encoder) SetIndent(prefix, indent string) {
   240  	enc.indentPrefix = prefix
   241  	enc.indentValue = indent
   242  }
   243  
   244  // SetEscapeHTML specifies whether problematic HTML characters
   245  // should be escaped inside JSON quoted strings.
   246  // The default behavior is to escape &, <, and > to \u0026, \u003c, and \u003e
   247  // to avoid certain safety problems that can arise when embedding JSON in HTML.
   248  //
   249  // In non-HTML settings where the escaping interferes with the readability
   250  // of the output, SetEscapeHTML(false) disables this behavior.
   251  func (enc *Encoder) SetEscapeHTML(on bool) {
   252  	enc.escapeHTML = on
   253  }
   254  
   255  // EDIT(begin): remove RawMessage
   256  //
   257  // // RawMessage is a raw encoded JSON value.
   258  // // It implements [Marshaler] and [Unmarshaler] and can
   259  // // be used to delay JSON decoding or precompute a JSON encoding.
   260  // type RawMessage []byte
   261  //
   262  // // MarshalJSON returns m as the JSON encoding of m.
   263  // func (m RawMessage) MarshalJSON() ([]byte, error) {
   264  // 	if m == nil {
   265  // 		return []byte("null"), nil
   266  // 	}
   267  // 	return m, nil
   268  // }
   269  //
   270  // // UnmarshalJSON sets *m to a copy of data.
   271  // func (m *RawMessage) UnmarshalJSON(data []byte) error {
   272  // 	if m == nil {
   273  // 		return errors.New("json.RawMessage: UnmarshalJSON on nil pointer")
   274  // 	}
   275  // 	*m = append((*m)[0:0], data...)
   276  // 	return nil
   277  // }
   278  //
   279  // var _ Marshaler = (*RawMessage)(nil)
   280  // var _ Unmarshaler = (*RawMessage)(nil)
   281  //
   282  // EDIT(end)
   283  
   284  // A Token holds a value of one of these types:
   285  //
   286  //   - [Delim], for the four JSON delimiters [ ] { }
   287  //   - bool, for JSON booleans
   288  //   - float64, for JSON numbers
   289  //   - [Number], for JSON numbers
   290  //   - string, for JSON string literals
   291  //   - nil, for JSON null
   292  type Token any
   293  
   294  const (
   295  	tokenTopValue = iota
   296  	tokenArrayStart
   297  	tokenArrayValue
   298  	tokenArrayComma
   299  	tokenObjectStart
   300  	tokenObjectKey
   301  	tokenObjectColon
   302  	tokenObjectValue
   303  	tokenObjectComma
   304  )
   305  
   306  // advance tokenstate from a separator state to a value state
   307  func (dec *Decoder) tokenPrepareForDecode() error {
   308  	// Note: Not calling peek before switch, to avoid
   309  	// putting peek into the standard Decode path.
   310  	// peek is only called when using the Token API.
   311  	switch dec.tokenState {
   312  	case tokenArrayComma:
   313  		c, err := dec.peek()
   314  		if err != nil {
   315  			return err
   316  		}
   317  		if c != ',' {
   318  			return &SyntaxError{"expected comma after array element", dec.InputOffset()}
   319  		}
   320  		dec.scanp++
   321  		dec.tokenState = tokenArrayValue
   322  	case tokenObjectColon:
   323  		c, err := dec.peek()
   324  		if err != nil {
   325  			return err
   326  		}
   327  		if c != ':' {
   328  			return &SyntaxError{"expected colon after object key", dec.InputOffset()}
   329  		}
   330  		dec.scanp++
   331  		dec.tokenState = tokenObjectValue
   332  	}
   333  	return nil
   334  }
   335  
   336  func (dec *Decoder) tokenValueAllowed() bool {
   337  	switch dec.tokenState {
   338  	case tokenTopValue, tokenArrayStart, tokenArrayValue, tokenObjectValue:
   339  		return true
   340  	}
   341  	return false
   342  }
   343  
   344  func (dec *Decoder) tokenValueEnd() {
   345  	switch dec.tokenState {
   346  	case tokenArrayStart, tokenArrayValue:
   347  		dec.tokenState = tokenArrayComma
   348  	case tokenObjectValue:
   349  		dec.tokenState = tokenObjectComma
   350  	}
   351  }
   352  
   353  // A Delim is a JSON array or object delimiter, one of [ ] { or }.
   354  type Delim rune
   355  
   356  func (d Delim) String() string {
   357  	return string(d)
   358  }
   359  
   360  // Token returns the next JSON token in the input stream.
   361  // At the end of the input stream, Token returns nil, [io.EOF].
   362  //
   363  // Token guarantees that the delimiters [ ] { } it returns are
   364  // properly nested and matched: if Token encounters an unexpected
   365  // delimiter in the input, it will return an error.
   366  //
   367  // The input stream consists of basic JSON values—bool, string,
   368  // number, and null—along with delimiters [ ] { } of type [Delim]
   369  // to mark the start and end of arrays and objects.
   370  // Commas and colons are elided.
   371  func (dec *Decoder) Token() (Token, error) {
   372  	for {
   373  		c, err := dec.peek()
   374  		if err != nil {
   375  			return nil, err
   376  		}
   377  		switch c {
   378  		case '[':
   379  			if !dec.tokenValueAllowed() {
   380  				return dec.tokenError(c)
   381  			}
   382  			dec.scanp++
   383  			dec.tokenStack = append(dec.tokenStack, dec.tokenState)
   384  			dec.tokenState = tokenArrayStart
   385  			return Delim('['), nil
   386  
   387  		case ']':
   388  			if dec.tokenState != tokenArrayStart && dec.tokenState != tokenArrayComma {
   389  				return dec.tokenError(c)
   390  			}
   391  			dec.scanp++
   392  			dec.tokenState = dec.tokenStack[len(dec.tokenStack)-1]
   393  			dec.tokenStack = dec.tokenStack[:len(dec.tokenStack)-1]
   394  			dec.tokenValueEnd()
   395  			return Delim(']'), nil
   396  
   397  		case '{':
   398  			if !dec.tokenValueAllowed() {
   399  				return dec.tokenError(c)
   400  			}
   401  			dec.scanp++
   402  			dec.tokenStack = append(dec.tokenStack, dec.tokenState)
   403  			dec.tokenState = tokenObjectStart
   404  			return Delim('{'), nil
   405  
   406  		case '}':
   407  			if dec.tokenState != tokenObjectStart && dec.tokenState != tokenObjectComma {
   408  				return dec.tokenError(c)
   409  			}
   410  			dec.scanp++
   411  			dec.tokenState = dec.tokenStack[len(dec.tokenStack)-1]
   412  			dec.tokenStack = dec.tokenStack[:len(dec.tokenStack)-1]
   413  			dec.tokenValueEnd()
   414  			return Delim('}'), nil
   415  
   416  		case ':':
   417  			if dec.tokenState != tokenObjectColon {
   418  				return dec.tokenError(c)
   419  			}
   420  			dec.scanp++
   421  			dec.tokenState = tokenObjectValue
   422  			continue
   423  
   424  		case ',':
   425  			if dec.tokenState == tokenArrayComma {
   426  				dec.scanp++
   427  				dec.tokenState = tokenArrayValue
   428  				continue
   429  			}
   430  			if dec.tokenState == tokenObjectComma {
   431  				dec.scanp++
   432  				dec.tokenState = tokenObjectKey
   433  				continue
   434  			}
   435  			return dec.tokenError(c)
   436  
   437  		case '"':
   438  			if dec.tokenState == tokenObjectStart || dec.tokenState == tokenObjectKey {
   439  				var x string
   440  				old := dec.tokenState
   441  				dec.tokenState = tokenTopValue
   442  				err := dec.Decode(&x)
   443  				dec.tokenState = old
   444  				if err != nil {
   445  					return nil, err
   446  				}
   447  				dec.tokenState = tokenObjectColon
   448  				return x, nil
   449  			}
   450  			fallthrough
   451  
   452  		default:
   453  			if !dec.tokenValueAllowed() {
   454  				return dec.tokenError(c)
   455  			}
   456  			var x any
   457  			if err := dec.Decode(&x); err != nil {
   458  				return nil, err
   459  			}
   460  			return x, nil
   461  		}
   462  	}
   463  }
   464  
   465  func (dec *Decoder) tokenError(c byte) (Token, error) {
   466  	var context string
   467  	switch dec.tokenState {
   468  	case tokenTopValue:
   469  		context = " looking for beginning of value"
   470  	case tokenArrayStart, tokenArrayValue, tokenObjectValue:
   471  		context = " looking for beginning of value"
   472  	case tokenArrayComma:
   473  		context = " after array element"
   474  	case tokenObjectKey:
   475  		context = " looking for beginning of object key string"
   476  	case tokenObjectColon:
   477  		context = " after object key"
   478  	case tokenObjectComma:
   479  		context = " after object key:value pair"
   480  	}
   481  	return nil, &SyntaxError{"invalid character " + quoteChar(c) + context, dec.InputOffset()}
   482  }
   483  
   484  // More reports whether there is another element in the
   485  // current array or object being parsed.
   486  func (dec *Decoder) More() bool {
   487  	c, err := dec.peek()
   488  	return err == nil && c != ']' && c != '}'
   489  }
   490  
   491  func (dec *Decoder) peek() (byte, error) {
   492  	var err error
   493  	for {
   494  		for i := dec.scanp; i < len(dec.buf); i++ {
   495  			c := dec.buf[i]
   496  			if isSpace(c) {
   497  				continue
   498  			}
   499  			dec.scanp = i
   500  			return c, nil
   501  		}
   502  		// buffer has been scanned, now report any error
   503  		if err != nil {
   504  			return 0, err
   505  		}
   506  		err = dec.refill()
   507  	}
   508  }
   509  
   510  // InputOffset returns the input stream byte offset of the current decoder position.
   511  // The offset gives the location of the end of the most recently returned token
   512  // and the beginning of the next token.
   513  func (dec *Decoder) InputOffset() int64 {
   514  	return dec.scanned + int64(dec.scanp)
   515  }