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
}