nodes.go 640 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package metainfo
  2. import (
  3. "fmt"
  4. "net"
  5. "strconv"
  6. "github.com/anacrolix/torrent/bencode"
  7. )
  8. type Node string
  9. var _ bencode.Unmarshaler = (*Node)(nil)
  10. func (n *Node) UnmarshalBencode(b []byte) (err error) {
  11. var iface interface{}
  12. err = bencode.Unmarshal(b, &iface)
  13. if err != nil {
  14. return
  15. }
  16. switch v := iface.(type) {
  17. case string:
  18. *n = Node(v)
  19. case []interface{}:
  20. func() {
  21. defer func() {
  22. r := recover()
  23. if r != nil {
  24. err = r.(error)
  25. }
  26. }()
  27. *n = Node(net.JoinHostPort(v[0].(string), strconv.FormatInt(v[1].(int64), 10)))
  28. }()
  29. default:
  30. err = fmt.Errorf("unsupported type: %T", iface)
  31. }
  32. return
  33. }