aboutsummaryrefslogtreecommitdiffstats
path: root/formats/pktline/encoder.go
diff options
context:
space:
mode:
Diffstat (limited to 'formats/pktline/encoder.go')
-rw-r--r--formats/pktline/encoder.go63
1 files changed, 63 insertions, 0 deletions
diff --git a/formats/pktline/encoder.go b/formats/pktline/encoder.go
new file mode 100644
index 0000000..dfa53e2
--- /dev/null
+++ b/formats/pktline/encoder.go
@@ -0,0 +1,63 @@
+package pktline
+
+import (
+ "errors"
+ "fmt"
+ "strings"
+)
+
+var (
+ ErrOverflow = errors.New("unexpected string length (overflow)")
+)
+
+// Encoder implements a pkt-line format encoder
+type Encoder struct {
+ lines []string
+}
+
+// NewEncoder returns a new Encoder
+func NewEncoder() *Encoder {
+ return &Encoder{make([]string, 0)}
+}
+
+// AddLine encode and adds a line to the encoder
+func (e *Encoder) AddLine(line string) error {
+ le, err := EncodeFromString(line + "\n")
+ if err != nil {
+ return err
+ }
+
+ e.lines = append(e.lines, le)
+ return nil
+}
+
+// AddFlush adds a flush-pkt to the encoder
+func (e *Encoder) AddFlush() {
+ e.lines = append(e.lines, "0000")
+}
+
+// Reader returns a string.Reader over the encoder
+func (e *Encoder) Reader() *strings.Reader {
+ data := strings.Join(e.lines, "")
+
+ return strings.NewReader(data)
+}
+
+// EncodeFromString encodes a string to pkt-line format
+func EncodeFromString(line string) (string, error) {
+ return Encode([]byte(line))
+}
+
+// Encode encodes a byte slice to pkt-line format
+func Encode(line []byte) (string, error) {
+ if line == nil {
+ return "0000", nil
+ }
+
+ l := len(line) + HeaderLength
+ if l > MaxLength {
+ return "", ErrOverflow
+ }
+
+ return fmt.Sprintf("%04x%s", l, line), nil
+}