aboutsummaryrefslogtreecommitdiff
path: root/bencode
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-06-11 02:19:43 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-06-11 02:19:43 +0200
commit4563480e23dafa469cc0c9a3d1b89358861cce3a (patch)
tree15f6bb94b5e38516a3203e7bd4af96d9e682b57c /bencode
parenta75f52e481d787bd57530114852696bb59a62b82 (diff)
Marshal []byte
Diffstat (limited to 'bencode')
-rw-r--r--bencode/bencode.go52
-rw-r--r--bencode/bencode_test.go8
2 files changed, 40 insertions, 20 deletions
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) {
diff --git a/bencode/bencode_test.go b/bencode/bencode_test.go
index f9018b2..01e0446 100644
--- a/bencode/bencode_test.go
+++ b/bencode/bencode_test.go
@@ -10,8 +10,14 @@ func TestMarshal(t *testing.T) {
v := torrent.Torrent{
Announce: "test",
AnnounceList: []string{"test1", "test2", "test3"},
- Comment: "comment",
CreationDate: 123,
+ Info: torrent.Info{
+ Length: 1000,
+ Files: []torrent.File{
+ {Path: "A"},
+ {Path: "B"},
+ },
+ },
}
out, err := Marshal(v)
if err != nil {