mirror of
https://github.com/fumiama/go-simple-protobuf.git
synced 2026-06-12 06:00:38 +08:00
feat: add writer
This commit is contained in:
62
writer.go
Normal file
62
writer.go
Normal file
@@ -0,0 +1,62 @@
|
||||
package spb
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
)
|
||||
|
||||
type Constructor struct {
|
||||
structlen, reallen uint32
|
||||
body bytes.Buffer
|
||||
}
|
||||
|
||||
// NewWriter 新的写入构造器
|
||||
func NewWriter(buf []byte) (c Constructor) {
|
||||
c.body = *bytes.NewBuffer(buf)
|
||||
return
|
||||
}
|
||||
|
||||
// WriteString 按字符串写入一项
|
||||
func (c *Constructor) WriteString(s string, cap uint32) error {
|
||||
if int(cap) < len(s) {
|
||||
return ErrInvalidDataLen
|
||||
}
|
||||
cnt, err := WriteNum(&c.body, cap)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
c.structlen += cap
|
||||
c.reallen += cnt
|
||||
cnt, err = WriteNum(&c.body, uint32(len(s)))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
c.reallen += cnt
|
||||
_, err = c.body.WriteString(s)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
c.reallen += uint32(len(s))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Cap structlen 目前写入的总长, 带 padding
|
||||
func (c *Constructor) Cap() uint32 {
|
||||
return c.structlen
|
||||
}
|
||||
|
||||
// Len reallen 目前写入的实值总长, 不带 padding
|
||||
func (c *Constructor) Len() uint32 {
|
||||
return c.reallen
|
||||
}
|
||||
|
||||
// WriteTo 将当前结果写出, 返回写入的实际长度
|
||||
func (c *Constructor) WriteTo(w io.Writer) (int64, error) {
|
||||
cnt, err := WriteNum(w, c.structlen)
|
||||
if err != nil {
|
||||
return int64(cnt), err
|
||||
}
|
||||
n, err := w.Write(c.body.Bytes())
|
||||
cnt += uint32(n)
|
||||
return int64(cnt), err
|
||||
}
|
||||
Reference in New Issue
Block a user