aboutsummaryrefslogtreecommitdiff
path: root/bencode
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-06-14 13:13:29 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-06-14 13:13:29 +0200
commit8c2becf66ba5a927564f13cb8e69f8bd6b972887 (patch)
treebcc4ce14b1f14c6ed56a6a01c34cdd7bce84d98a /bencode
parenta87bbc6e8637e910fc81cde0f0ee1ab40347ffbd (diff)
Simplify marshalDict
Diffstat (limited to 'bencode')
-rw-r--r--bencode/bencode.go24
1 files changed, 13 insertions, 11 deletions
diff --git a/bencode/bencode.go b/bencode/bencode.go
index 244fc66..e761940 100644
--- a/bencode/bencode.go
+++ b/bencode/bencode.go
@@ -59,33 +59,35 @@ func isEmpty(v reflect.Value) bool {
return false
}
+type byName []reflect.StructField
+
+func (n byName) Len() int { return len(n) }
+func (n byName) Less(i, j int) bool { return n[i].Name < n[j].Name }
+func (n byName) Swap(i, j int) { n[i], n[j] = n[j], n[i] }
+
func marshalDict(out io.Writer, v reflect.Value) {
switch val := v.Interface().(type) {
case time.Time:
marshalInt(out, val.Unix())
default:
t := v.Type()
- names := make([]string, t.NumField())
+ fields := make([]reflect.StructField, t.NumField())
for i := 0; i < t.NumField(); i++ {
- names[i] = t.Field(i).Name
+ fields[i] = t.Field(i)
}
- sort.Sort(sort.StringSlice(names))
+ sort.Sort(byName(fields))
io.WriteString(out, "d")
- for _, n := range names {
- tf, ok := t.FieldByName(n)
- if !ok {
- continue
- }
- tag := tf.Tag.Get("bencode")
+ for _, n := range fields {
+ tag := n.Tag.Get("bencode")
if tag == "-" {
continue
}
name, param := parseTag(tag)
if name == "" {
- name = n
+ name = n.Name
}
- vf := v.FieldByName(n)
+ vf := v.FieldByIndex(n.Index)
if param == "optional" && isEmpty(vf) {
continue
}