errors: fix FromError and errors.Unmarshal #79
| @@ -84,9 +84,9 @@ func New(id, detail string, code int32) error { | ||||
| // Parse tries to parse a JSON string into an error. If that | ||||
| // fails, it will set the given string as the error detail. | ||||
| func Parse(err string) *Error { | ||||
| 	e := new(Error) | ||||
| 	errr := json.Unmarshal([]byte(err), e) | ||||
| 	if errr != nil { | ||||
| 	e := &Error{} | ||||
| 	nerr := json.Unmarshal([]byte(err), e) | ||||
| 	if nerr != nil { | ||||
| 		e.Detail = err | ||||
| 	} | ||||
| 	return e | ||||
| @@ -283,6 +283,10 @@ func (e *Error) Unmarshal(data []byte) error { | ||||
| 			return r == ':' | ||||
| 		}) | ||||
| 		for idx := 0; idx < len(nparts); idx++ { | ||||
| 			if len(nparts[idx+1]) < 3 { | ||||
| 				idx++ | ||||
| 				continue | ||||
| 			} | ||||
| 			switch { | ||||
| 			case nparts[idx] == `"id"`: | ||||
| 				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) | ||||
| 			} | ||||
| 			idx++ | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
|   | ||||
| @@ -2,10 +2,24 @@ package errors | ||||
|  | ||||
| import ( | ||||
| 	er "errors" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"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) { | ||||
| 	err := NotFound("go.micro.test", "%s", "example") | ||||
| 	merr := FromError(err) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user