44 lines
709 B
Go
44 lines
709 B
Go
|
package internal
|
||
|
|
||
|
import (
|
||
|
fasthex "github.com/tmthrgd/go-hex"
|
||
|
)
|
||
|
|
||
|
type HexEncoder struct {
|
||
|
b []byte
|
||
|
written bool
|
||
|
}
|
||
|
|
||
|
func NewHexEncoder(b []byte) *HexEncoder {
|
||
|
return &HexEncoder{
|
||
|
b: b,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (enc *HexEncoder) Bytes() []byte {
|
||
|
return enc.b
|
||
|
}
|
||
|
|
||
|
func (enc *HexEncoder) Write(b []byte) (int, error) {
|
||
|
if !enc.written {
|
||
|
enc.b = append(enc.b, '\'')
|
||
|
enc.b = append(enc.b, `\x`...)
|
||
|
enc.written = true
|
||
|
}
|
||
|
|
||
|
i := len(enc.b)
|
||
|
enc.b = append(enc.b, make([]byte, fasthex.EncodedLen(len(b)))...)
|
||
|
fasthex.Encode(enc.b[i:], b)
|
||
|
|
||
|
return len(b), nil
|
||
|
}
|
||
|
|
||
|
func (enc *HexEncoder) Close() error {
|
||
|
if enc.written {
|
||
|
enc.b = append(enc.b, '\'')
|
||
|
} else {
|
||
|
enc.b = append(enc.b, "NULL"...)
|
||
|
}
|
||
|
return nil
|
||
|
}
|