77 lines
1.4 KiB
Go
77 lines
1.4 KiB
Go
package parser
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"strconv"
|
|
)
|
|
|
|
// Buffer is an binary buffer handler used in emit args. All buffers will be
|
|
// sent as binary in the transport layer.
|
|
type Buffer struct {
|
|
num uint64
|
|
isBinary bool
|
|
|
|
Data []byte
|
|
}
|
|
|
|
type BufferData struct {
|
|
Num uint64
|
|
PlaceHolder bool `json:"_placeholder"`
|
|
Data []byte
|
|
}
|
|
|
|
// MarshalJSON marshals to JSON.
|
|
func (a Buffer) MarshalJSON() ([]byte, error) {
|
|
var buf bytes.Buffer
|
|
if err := a.marshalJSONBuf(&buf); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return buf.Bytes(), nil
|
|
}
|
|
|
|
func (a *Buffer) marshalJSONBuf(buf *bytes.Buffer) error {
|
|
encode := a.encodeText
|
|
if a.isBinary {
|
|
encode = a.encodeBinary
|
|
}
|
|
|
|
return encode(buf)
|
|
}
|
|
|
|
func (a *Buffer) encodeText(buf *bytes.Buffer) error {
|
|
buf.WriteString(`{"type":"Buffer","data":[`)
|
|
for i, d := range a.Data {
|
|
if i > 0 {
|
|
buf.WriteString(",")
|
|
}
|
|
buf.WriteString(strconv.Itoa(int(d)))
|
|
}
|
|
buf.WriteString("]}")
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a *Buffer) encodeBinary(buf *bytes.Buffer) error {
|
|
buf.WriteString(`{"_placeholder":true,"num":`)
|
|
buf.WriteString(strconv.FormatUint(a.num, 10))
|
|
buf.WriteString("}")
|
|
|
|
return nil
|
|
}
|
|
|
|
// UnmarshalJSON unmarshal data from JSON.
|
|
func (a *Buffer) UnmarshalJSON(b []byte) error {
|
|
var data BufferData
|
|
if err := json.Unmarshal(b, &data); err != nil {
|
|
return err
|
|
}
|
|
|
|
a.isBinary = data.PlaceHolder
|
|
a.Data = data.Data
|
|
a.num = data.Num
|
|
|
|
return nil
|
|
}
|