package types

import (
	
	
	
	

	fasthex 
)

type HexEncoder struct {
	b       []byte
	flags   int
	written bool
}

func ( []byte,  int) *HexEncoder {
	return &HexEncoder{
		b:     ,
		flags: ,
	}
}

func ( *HexEncoder) () []byte {
	return .b
}

func ( *HexEncoder) ( []byte) (int, error) {
	if !.written {
		if hasFlag(.flags, arrayFlag) {
			.b = append(.b, `"\`...)
		} else if hasFlag(.flags, quoteFlag) {
			.b = append(.b, '\'')
		}
		.b = append(.b, `\x`...)
		.written = true
	}

	 := len(.b)
	.b = append(.b, make([]byte, fasthex.EncodedLen(len()))...)
	fasthex.Encode(.b[:], )

	return len(), nil
}

func ( *HexEncoder) () error {
	if .written {
		if hasFlag(.flags, arrayFlag) {
			.b = append(.b, '"')
		} else if hasFlag(.flags, quoteFlag) {
			.b = append(.b, '\'')
		}
	} else {
		.b = AppendNull(.b, .flags)
	}
	return nil
}

//------------------------------------------------------------------------------

func ( Reader,  int) (io.Reader, error) {
	if  <= 0 {
		var  bytes.Reader
		return &, nil
	}

	if ,  := .ReadByte();  != nil {
		return nil, 
	} else if  != '\\' {
		return nil, fmt.Errorf("got %q, wanted %q", , '\\')
	}

	if ,  := .ReadByte();  != nil {
		return nil, 
	} else if  != 'x' {
		return nil, fmt.Errorf("got %q, wanted %q", , 'x')
	}

	return hex.NewDecoder(), nil
}