From 4563480e23dafa469cc0c9a3d1b89358861cce3a Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 11 Jun 2016 02:19:43 +0200 Subject: Marshal []byte --- bencode/bencode.go | 52 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 19 deletions(-) (limited to 'bencode/bencode.go') diff --git a/bencode/bencode.go b/bencode/bencode.go index 532ac8a..0d536d3 100644 --- a/bencode/bencode.go +++ b/bencode/bencode.go @@ -44,29 +44,43 @@ func marshalField(out io.Writer, v reflect.Value) error { case reflect.Int: marshalInt(out, v.Int()) case reflect.Slice: - fmt.Fprint(out, "l") + marshalList(out, v) + case reflect.Struct: + marshalDict(out, v) + } + return nil +} + +func marshalDict(out io.Writer, v reflect.Value) { + t := v.Type() + io.WriteString(out, "d") + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + tag := f.Tag.Get("bencode") + if tag == "-" { + continue + } + name, _ := parseTag(tag) + if name == "" { + name = f.Name + } + marshalString(out, name) + marshalField(out, v.Field(i)) + } + io.WriteString(out, "e") +} + +func marshalList(out io.Writer, v reflect.Value) { + switch v.Type().Elem().Kind() { + case reflect.Uint8: + marshalString(out, string(v.Bytes())) + default: + io.WriteString(out, "l") for i := 0; i < v.Len(); i++ { marshalField(out, v.Index(i)) } - fmt.Fprint(out, "e") - case reflect.Struct: - t := v.Type() - fmt.Fprint(out, "d") - for i := 0; i < t.NumField(); i++ { - tag := t.Field(i).Tag.Get("bencode") - if tag == "-" { - continue - } - name, _ := parseTag(tag) - if name == "" { - name = t.Field(i).Name - } - marshalString(out, name) - marshalField(out, v.Field(i)) - } - fmt.Fprint(out, "e") + io.WriteString(out, "e") } - return nil } func marshalString(out io.Writer, s string) { -- cgit v1.2.3