package bencode
-import "bytes"
-import "bufio"
-import "reflect"
-import "strconv"
-import "io"
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "io"
+ "reflect"
+)
//----------------------------------------------------------------------------
// Errors
// Malformed bencode input, unmarshaler failed to parse it.
type SyntaxError struct {
- Offset int64 // location of the error
- what string // error description
+ Offset int64 // location of the error
+ What error // error description
}
func (e *SyntaxError) Error() string {
- return "bencode: syntax error (offset: " +
- strconv.FormatInt(e.Offset, 10) +
- "): " + e.what
+ return fmt.Sprintf("bencode: syntax error (offset: %d): %s", e.Offset, e.What)
}
// A non-nil error was returned after calling MarshalBencode on a type which
// implements the Unmarshaler interface.
type UnmarshalerError struct {
Type reflect.Type
- Err error
+ Err error
}
func (e *UnmarshalerError) Error() string {
package bencode
-import "reflect"
-import "runtime"
-import "bufio"
-import "bytes"
-import "strconv"
-import "strings"
-import "io"
+import (
+ "bufio"
+ "bytes"
+ "errors"
+ "io"
+ "reflect"
+ "runtime"
+ "strconv"
+ "strings"
+)
type decoder struct {
*bufio.Reader
if err == io.EOF {
panic(&SyntaxError{
Offset: offset,
- what: "unexpected EOF",
+ What: io.ErrUnexpectedEOF,
})
}
}
if err != nil {
panic(&SyntaxError{
Offset: offset,
- what: err.Error(),
+ What: err,
})
}
}
if d.buf.Len() == 0 {
panic(&SyntaxError{
Offset: start,
- what: "empty integer value",
+ What: errors.New("empty integer value"),
})
}
check_for_unexpected_eof(err, d.offset)
panic(&SyntaxError{
Offset: d.offset,
- what: "unexpected I/O error: " + err.Error(),
+ What: errors.New("unexpected I/O error: " + err.Error()),
})
}
if !ok {
panic(&SyntaxError{
Offset: d.offset,
- what: "unexpected end of dict, no matching value for a given key",
+ What: errors.New("unexpected end of dict, no matching value for a given key"),
})
}
continue
if !d.parse_value(valuev) {
panic(&SyntaxError{
Offset: d.offset,
- what: "unexpected end of dict, no matching value for a given key",
+ What: errors.New("unexpected end of dict, no matching value for a given key"),
})
}
check_for_unexpected_eof(err, d.offset)
panic(&SyntaxError{
Offset: d.offset,
- what: "unexpected I/O error: " + err.Error(),
+ What: errors.New("unexpected I/O error: " + err.Error()),
})
}
break
// unknown value
panic(&SyntaxError{
Offset: d.offset - 1,
- what: "unknown value type (invalid bencode?)",
+ What: errors.New("unknown value type (invalid bencode?)"),
})
}
// unknown value
panic(&SyntaxError{
Offset: d.offset - 1,
- what: "unknown value type (invalid bencode?)",
+ What: errors.New("unknown value type (invalid bencode?)"),
})
}
// unknown value
panic(&SyntaxError{
Offset: d.offset - 1,
- what: "unknown value type (invalid bencode?)",
+ What: errors.New("unknown value type (invalid bencode?)"),
})
}
panic("unreachable")
if d.buf.Len() == 0 {
panic(&SyntaxError{
Offset: start,
- what: "empty integer value",
+ What: errors.New("empty integer value"),
})
}
check_for_unexpected_eof(err, d.offset)
panic(&SyntaxError{
Offset: d.offset,
- what: "unexpected I/O error: " + err.Error(),
+ What: errors.New("unexpected I/O error: " + err.Error()),
})
}
if !ok {
panic(&SyntaxError{
Offset: d.offset,
- what: "non-string key in a dict",
+ What: errors.New("non-string key in a dict"),
})
}
if !ok {
panic(&SyntaxError{
Offset: d.offset,
- what: "unexpected end of dict, no matching value for a given key",
+ What: errors.New("unexpected end of dict, no matching value for a given key"),
})
}