From cdfba7a1acc2435cf33d921d90ef84c98f285320 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Tue, 18 Nov 2014 22:08:08 -0600 Subject: [PATCH] Expose SyntaxError reason with a proper error --- bencode/api.go | 22 +++++++++++----------- bencode/decode.go | 45 ++++++++++++++++++++++++--------------------- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/bencode/api.go b/bencode/api.go index 47f24642..b4ddcec9 100644 --- a/bencode/api.go +++ b/bencode/api.go @@ -1,10 +1,12 @@ package bencode -import "bytes" -import "bufio" -import "reflect" -import "strconv" -import "io" +import ( + "bufio" + "bytes" + "fmt" + "io" + "reflect" +) //---------------------------------------------------------------------------- // Errors @@ -61,14 +63,12 @@ func (e *UnmarshalFieldError) Error() string { // 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 @@ -86,7 +86,7 @@ func (e *MarshalerError) Error() string { // implements the Unmarshaler interface. type UnmarshalerError struct { Type reflect.Type - Err error + Err error } func (e *UnmarshalerError) Error() string { diff --git a/bencode/decode.go b/bencode/decode.go index 82cad32b..7db899ae 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -1,12 +1,15 @@ 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 @@ -38,7 +41,7 @@ func check_for_unexpected_eof(err error, offset int64) { if err == io.EOF { panic(&SyntaxError{ Offset: offset, - what: "unexpected EOF", + What: io.ErrUnexpectedEOF, }) } } @@ -70,7 +73,7 @@ func check_for_int_parse_error(err error, offset int64) { if err != nil { panic(&SyntaxError{ Offset: offset, - what: err.Error(), + What: err, }) } } @@ -82,7 +85,7 @@ func (d *decoder) parse_int(v reflect.Value) { if d.buf.Len() == 0 { panic(&SyntaxError{ Offset: start, - what: "empty integer value", + What: errors.New("empty integer value"), }) } @@ -138,7 +141,7 @@ func (d *decoder) parse_string(v reflect.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()), }) } @@ -254,7 +257,7 @@ func (d *decoder) parse_dict(v reflect.Value) { 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 @@ -265,7 +268,7 @@ func (d *decoder) parse_dict(v reflect.Value) { 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"), }) } @@ -359,7 +362,7 @@ func (d *decoder) read_one_value() bool { 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 @@ -368,7 +371,7 @@ func (d *decoder) read_one_value() bool { // unknown value panic(&SyntaxError{ Offset: d.offset - 1, - what: "unknown value type (invalid bencode?)", + What: errors.New("unknown value type (invalid bencode?)"), }) } @@ -453,7 +456,7 @@ func (d *decoder) parse_value(v reflect.Value) bool { // unknown value panic(&SyntaxError{ Offset: d.offset - 1, - what: "unknown value type (invalid bencode?)", + What: errors.New("unknown value type (invalid bencode?)"), }) } @@ -487,7 +490,7 @@ func (d *decoder) parse_value_interface() (interface{}, bool) { // unknown value panic(&SyntaxError{ Offset: d.offset - 1, - what: "unknown value type (invalid bencode?)", + What: errors.New("unknown value type (invalid bencode?)"), }) } panic("unreachable") @@ -499,7 +502,7 @@ func (d *decoder) parse_int_interface() interface{} { if d.buf.Len() == 0 { panic(&SyntaxError{ Offset: start, - what: "empty integer value", + What: errors.New("empty integer value"), }) } @@ -524,7 +527,7 @@ func (d *decoder) parse_string_interface() interface{} { 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()), }) } @@ -545,7 +548,7 @@ func (d *decoder) parse_dict_interface() interface{} { if !ok { panic(&SyntaxError{ Offset: d.offset, - what: "non-string key in a dict", + What: errors.New("non-string key in a dict"), }) } @@ -553,7 +556,7 @@ func (d *decoder) parse_dict_interface() interface{} { 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"), }) } -- 2.48.1