package decoder

import (
	
	
	

	
	
)

type bytesDecoder struct {
	typ           *runtime.Type
	sliceDecoder  Decoder
	stringDecoder *stringDecoder
	structName    string
	fieldName     string
}

func byteUnmarshalerSliceDecoder( *runtime.Type,  string,  string) Decoder {
	var  Decoder
	switch {
	case runtime.PtrTo().Implements(unmarshalJSONType):
		 = newUnmarshalJSONDecoder(runtime.PtrTo(), , )
	case runtime.PtrTo().Implements(unmarshalTextType):
		 = newUnmarshalTextDecoder(runtime.PtrTo(), , )
	default:
		, _ = compileUint8(, , )
	}
	return newSliceDecoder(, , 1, , )
}

func newBytesDecoder( *runtime.Type,  string,  string) *bytesDecoder {
	return &bytesDecoder{
		typ:           ,
		sliceDecoder:  byteUnmarshalerSliceDecoder(, , ),
		stringDecoder: newStringDecoder(, ),
		structName:    ,
		fieldName:     ,
	}
}

func ( *bytesDecoder) ( *Stream,  int64,  unsafe.Pointer) error {
	,  := .decodeStreamBinary(, , )
	if  != nil {
		return 
	}
	if  == nil {
		.reset()
		return nil
	}
	 := base64.StdEncoding.DecodedLen(len())
	 := make([]byte, )
	,  := base64.StdEncoding.Decode(, )
	if  != nil {
		return 
	}
	*(*[]byte)() = [:]
	.reset()
	return nil
}

func ( *bytesDecoder) ( *RuntimeContext, ,  int64,  unsafe.Pointer) (int64, error) {
	, ,  := .decodeBinary(, , , )
	if  != nil {
		return 0, 
	}
	if  == nil {
		return , nil
	}
	 = 
	 := base64.StdEncoding.DecodedLen(len())
	 := make([]byte, )
	,  := base64.StdEncoding.Decode(, )
	if  != nil {
		return 0, 
	}
	*(*[]byte)() = [:]
	return , nil
}

func ( *bytesDecoder) ( *RuntimeContext, ,  int64) ([][]byte, int64, error) {
	return nil, 0, fmt.Errorf("json: []byte decoder does not support decode path")
}

func ( *bytesDecoder) ( *Stream,  int64,  unsafe.Pointer) ([]byte, error) {
	 := .skipWhiteSpace()
	if  == '[' {
		if .sliceDecoder == nil {
			return nil, &errors.UnmarshalTypeError{
				Type:   runtime.RType2Type(.typ),
				Offset: .totalOffset(),
			}
		}
		 := .sliceDecoder.DecodeStream(, , )
		return nil, 
	}
	return .stringDecoder.decodeStreamByte()
}

func ( *bytesDecoder) ( *RuntimeContext, ,  int64,  unsafe.Pointer) ([]byte, int64, error) {
	 := .Buf
	 = skipWhiteSpace(, )
	if [] == '[' {
		if .sliceDecoder == nil {
			return nil, 0, &errors.UnmarshalTypeError{
				Type:   runtime.RType2Type(.typ),
				Offset: ,
			}
		}
		,  := .sliceDecoder.Decode(, , , )
		if  != nil {
			return nil, 0, 
		}
		return nil, , nil
	}
	return .stringDecoder.decodeByte(, )
}