errors: fix FromError and errors.Unmarshal #79

Merged
vtolstov merged 1 commits from errors into master 2022-01-21 18:21:13 +03:00
2 changed files with 22 additions and 3 deletions

View File

@ -84,9 +84,9 @@ func New(id, detail string, code int32) error {
// Parse tries to parse a JSON string into an error. If that // Parse tries to parse a JSON string into an error. If that
// fails, it will set the given string as the error detail. // fails, it will set the given string as the error detail.
func Parse(err string) *Error { func Parse(err string) *Error {
e := new(Error) e := &Error{}
errr := json.Unmarshal([]byte(err), e) nerr := json.Unmarshal([]byte(err), e)
if errr != nil { if nerr != nil {
e.Detail = err e.Detail = err
} }
return e return e
@ -283,6 +283,10 @@ func (e *Error) Unmarshal(data []byte) error {
return r == ':' return r == ':'
}) })
for idx := 0; idx < len(nparts); idx++ { for idx := 0; idx < len(nparts); idx++ {
if len(nparts[idx+1]) < 3 {
idx++
continue
}
switch { switch {
case nparts[idx] == `"id"`: case nparts[idx] == `"id"`:
e.ID = nparts[idx+1][1 : len(nparts[idx+1])-1] e.ID = nparts[idx+1][1 : len(nparts[idx+1])-1]
@ -297,6 +301,7 @@ func (e *Error) Unmarshal(data []byte) error {
} }
e.Code = int32(c) e.Code = int32(c)
} }
idx++
} }
} }
return nil return nil

View File

@ -2,10 +2,24 @@ package errors
import ( import (
er "errors" er "errors"
"fmt"
"net/http" "net/http"
"testing" "testing"
) )
func TestEmpty(t *testing.T) {
msg := "test"
var err *Error
err = FromError(fmt.Errorf(msg))
if err.Detail != msg {
t.Fatalf("invalid error %v", err)
}
err = FromError(fmt.Errorf(`{"id":"","detail":"%s","status":"%s","code":0}`, msg, msg))
if err.Detail != msg || err.Status != msg {
t.Fatalf("invalid error %#+v", err)
}
}
func TestFromError(t *testing.T) { func TestFromError(t *testing.T) {
err := NotFound("go.micro.test", "%s", "example") err := NotFound("go.micro.test", "%s", "example")
merr := FromError(err) merr := FromError(err)