Skip to content

Commit 03eacb9

Browse files
committed
Close #10: Added RecoverableError type and IsRecoverableError() method to assist recovery from malformed or unexpected packets.
1 parent 71af1fb commit 03eacb9

File tree

4 files changed

+22
-5
lines changed

4 files changed

+22
-5
lines changed

connection.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func (c *Connection) Query(id Identifier) (dg *Datagram, err error) {
120120
return nil, err
121121
}
122122
if dg.Cmd != Response || dg.Id != id {
123-
return nil, fmt.Errorf("invalid response: %v", dg)
123+
return nil, RecoverableError{fmt.Sprintf("invalid response to read of %08X: %v", id, dg)}
124124
}
125125
c.cache.Put(dg)
126126

datagram.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ func (d *Datagram) String() string {
203203
// Returns datagram body value as a float32
204204
func (d *Datagram) Float32() (val float32, err error) {
205205
if len(d.Data) != 4 {
206-
return 0, fmt.Errorf("invalid data length %d", len(d.Data))
206+
return 0, RecoverableError{fmt.Sprintf("invalid data length %d", len(d.Data))}
207207
}
208208

209209
return math.Float32frombits(binary.BigEndian.Uint32(d.Data)), nil
@@ -212,7 +212,7 @@ func (d *Datagram) Float32() (val float32, err error) {
212212
// Returns datagram body value as a uint16
213213
func (d *Datagram) Uint16() (val uint16, err error) {
214214
if len(d.Data) != 2 {
215-
return 0, fmt.Errorf("invalid data length %d", len(d.Data))
215+
return 0, RecoverableError{fmt.Sprintf("invalid data length %d", len(d.Data))}
216216
}
217217

218218
return binary.BigEndian.Uint16(d.Data), nil
@@ -221,7 +221,7 @@ func (d *Datagram) Uint16() (val uint16, err error) {
221221
// Returns datagram body value as a uint8
222222
func (d *Datagram) Uint8() (val uint8, err error) {
223223
if len(d.Data) != 1 {
224-
return 0, fmt.Errorf("invalid data length %d", len(d.Data))
224+
return 0, RecoverableError{fmt.Sprintf("invalid data length %d", len(d.Data))}
225225
}
226226

227227
return uint8(d.Data[0]), nil

parse.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ func (p *DatagramParser) Parse() (dg *Datagram, err error) {
148148
//fmt.Printf("(%v)\n", state)
149149

150150
if state != Done {
151-
return dg, fmt.Errorf("parsing failed in state %d", state)
151+
return dg, RecoverableError{fmt.Sprintf("parsing failed in state %d", state)}
152152
}
153153
return dg, nil
154154
}

recoverable.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package rct;
2+
3+
// Errors caused by a malformed or unexpected packet, which can be potentially be recovered by retrying the transmission
4+
type RecoverableError struct {
5+
Err string
6+
}
7+
8+
// Prints error to string
9+
func (e RecoverableError) Error() string {
10+
return e.Err
11+
}
12+
13+
// Returns true if the given error is potentially recoverable
14+
func IsRecoverableError(err error) bool {
15+
_, ok:=err.(RecoverableError)
16+
return ok
17+
}

0 commit comments

Comments
 (0)