mirror of
https://github.com/42wim/matterbridge
synced 2024-11-03 15:40:24 +00:00
242 lines
5.3 KiB
Go
242 lines
5.3 KiB
Go
package gojay
|
|
|
|
// DecodeBool reads the next JSON-encoded value from the decoder's input (io.Reader)
|
|
// and stores it in the boolean pointed to by v.
|
|
//
|
|
// See the documentation for Unmarshal for details about the conversion of JSON into a Go value.
|
|
func (dec *Decoder) DecodeBool(v *bool) error {
|
|
if dec.isPooled == 1 {
|
|
panic(InvalidUsagePooledDecoderError("Invalid usage of pooled decoder"))
|
|
}
|
|
return dec.decodeBool(v)
|
|
}
|
|
func (dec *Decoder) decodeBool(v *bool) error {
|
|
for ; dec.cursor < dec.length || dec.read(); dec.cursor++ {
|
|
switch dec.data[dec.cursor] {
|
|
case ' ', '\n', '\t', '\r', ',':
|
|
continue
|
|
case 't':
|
|
dec.cursor++
|
|
err := dec.assertTrue()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*v = true
|
|
return nil
|
|
case 'f':
|
|
dec.cursor++
|
|
err := dec.assertFalse()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*v = false
|
|
return nil
|
|
case 'n':
|
|
dec.cursor++
|
|
err := dec.assertNull()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*v = false
|
|
return nil
|
|
default:
|
|
dec.err = dec.makeInvalidUnmarshalErr(v)
|
|
err := dec.skipData()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
func (dec *Decoder) decodeBoolNull(v **bool) error {
|
|
for ; dec.cursor < dec.length || dec.read(); dec.cursor++ {
|
|
switch dec.data[dec.cursor] {
|
|
case ' ', '\n', '\t', '\r', ',':
|
|
continue
|
|
case 't':
|
|
dec.cursor++
|
|
err := dec.assertTrue()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if *v == nil {
|
|
*v = new(bool)
|
|
}
|
|
**v = true
|
|
return nil
|
|
case 'f':
|
|
dec.cursor++
|
|
err := dec.assertFalse()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if *v == nil {
|
|
*v = new(bool)
|
|
}
|
|
**v = false
|
|
return nil
|
|
case 'n':
|
|
dec.cursor++
|
|
err := dec.assertNull()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
default:
|
|
dec.err = dec.makeInvalidUnmarshalErr(v)
|
|
err := dec.skipData()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (dec *Decoder) assertTrue() error {
|
|
i := 0
|
|
for ; dec.cursor < dec.length || dec.read(); dec.cursor++ {
|
|
switch i {
|
|
case 0:
|
|
if dec.data[dec.cursor] != 'r' {
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
case 1:
|
|
if dec.data[dec.cursor] != 'u' {
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
case 2:
|
|
if dec.data[dec.cursor] != 'e' {
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
case 3:
|
|
switch dec.data[dec.cursor] {
|
|
case ' ', '\b', '\t', '\n', ',', ']', '}':
|
|
// dec.cursor--
|
|
return nil
|
|
default:
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
}
|
|
i++
|
|
}
|
|
if i == 3 {
|
|
return nil
|
|
}
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
|
|
func (dec *Decoder) assertNull() error {
|
|
i := 0
|
|
for ; dec.cursor < dec.length || dec.read(); dec.cursor++ {
|
|
switch i {
|
|
case 0:
|
|
if dec.data[dec.cursor] != 'u' {
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
case 1:
|
|
if dec.data[dec.cursor] != 'l' {
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
case 2:
|
|
if dec.data[dec.cursor] != 'l' {
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
case 3:
|
|
switch dec.data[dec.cursor] {
|
|
case ' ', '\t', '\n', ',', ']', '}':
|
|
// dec.cursor--
|
|
return nil
|
|
default:
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
}
|
|
i++
|
|
}
|
|
if i == 3 {
|
|
return nil
|
|
}
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
|
|
func (dec *Decoder) assertFalse() error {
|
|
i := 0
|
|
for ; dec.cursor < dec.length || dec.read(); dec.cursor++ {
|
|
switch i {
|
|
case 0:
|
|
if dec.data[dec.cursor] != 'a' {
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
case 1:
|
|
if dec.data[dec.cursor] != 'l' {
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
case 2:
|
|
if dec.data[dec.cursor] != 's' {
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
case 3:
|
|
if dec.data[dec.cursor] != 'e' {
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
case 4:
|
|
switch dec.data[dec.cursor] {
|
|
case ' ', '\t', '\n', ',', ']', '}':
|
|
// dec.cursor--
|
|
return nil
|
|
default:
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
}
|
|
i++
|
|
}
|
|
if i == 4 {
|
|
return nil
|
|
}
|
|
return dec.raiseInvalidJSONErr(dec.cursor)
|
|
}
|
|
|
|
// Add Values functions
|
|
|
|
// AddBool decodes the JSON value within an object or an array to a *bool.
|
|
// If next key is neither null nor a JSON boolean, an InvalidUnmarshalError will be returned.
|
|
// If next key is null, bool will be false.
|
|
func (dec *Decoder) AddBool(v *bool) error {
|
|
return dec.Bool(v)
|
|
}
|
|
|
|
// AddBoolNull decodes the JSON value within an object or an array to a *bool.
|
|
// If next key is neither null nor a JSON boolean, an InvalidUnmarshalError will be returned.
|
|
// If next key is null, bool will be false.
|
|
// If a `null` is encountered, gojay does not change the value of the pointer.
|
|
func (dec *Decoder) AddBoolNull(v **bool) error {
|
|
return dec.BoolNull(v)
|
|
}
|
|
|
|
// Bool decodes the JSON value within an object or an array to a *bool.
|
|
// If next key is neither null nor a JSON boolean, an InvalidUnmarshalError will be returned.
|
|
// If next key is null, bool will be false.
|
|
func (dec *Decoder) Bool(v *bool) error {
|
|
err := dec.decodeBool(v)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
dec.called |= 1
|
|
return nil
|
|
}
|
|
|
|
// BoolNull decodes the JSON value within an object or an array to a *bool.
|
|
// If next key is neither null nor a JSON boolean, an InvalidUnmarshalError will be returned.
|
|
// If next key is null, bool will be false.
|
|
func (dec *Decoder) BoolNull(v **bool) error {
|
|
err := dec.decodeBoolNull(v)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
dec.called |= 1
|
|
return nil
|
|
}
|