Skip to content

Commit 2c02d70

Browse files
committed
Experimental: Embed webrpc errors source code
1 parent 277a87f commit 2c02d70

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

errors.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package gospeak
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
)
7+
8+
// Deprecated: This type may be removed in the future.
9+
type WebRPCError struct {
10+
Name string `json:"error"`
11+
Code int `json:"code"`
12+
Message string `json:"msg"`
13+
Cause string `json:"cause,omitempty"`
14+
HTTPStatus int `json:"status"`
15+
cause error
16+
}
17+
18+
var _ error = WebRPCError{}
19+
20+
func (e WebRPCError) Error() string {
21+
if e.cause != nil {
22+
return fmt.Sprintf("%s %d: %s: %v", e.Name, e.Code, e.Message, e.cause)
23+
}
24+
return fmt.Sprintf("%s %d: %s", e.Name, e.Code, e.Message)
25+
}
26+
27+
func (e WebRPCError) Is(target error) bool {
28+
if rpcErr, ok := target.(WebRPCError); ok {
29+
return rpcErr.Code == e.Code
30+
}
31+
return errors.Is(e.cause, target)
32+
}
33+
34+
func (e WebRPCError) Unwrap() error {
35+
return e.cause
36+
}
37+
38+
func ErrorWithCause(rpcErr WebRPCError, cause error) WebRPCError {
39+
err := rpcErr
40+
err.cause = cause
41+
err.Cause = cause.Error()
42+
return err
43+
}
44+
45+
// Webrpc errors
46+
var (
47+
ErrWebrpcEndpoint = WebRPCError{Code: 0, Name: "WebrpcEndpoint", Message: "endpoint error", HTTPStatus: 400}
48+
ErrWebrpcRequestFailed = WebRPCError{Code: -1, Name: "WebrpcRequestFailed", Message: "request failed", HTTPStatus: 400}
49+
ErrWebrpcBadRoute = WebRPCError{Code: -2, Name: "WebrpcBadRoute", Message: "bad route", HTTPStatus: 404}
50+
ErrWebrpcBadMethod = WebRPCError{Code: -3, Name: "WebrpcBadMethod", Message: "bad method", HTTPStatus: 405}
51+
ErrWebrpcBadRequest = WebRPCError{Code: -4, Name: "WebrpcBadRequest", Message: "bad request", HTTPStatus: 400}
52+
ErrWebrpcBadResponse = WebRPCError{Code: -5, Name: "WebrpcBadResponse", Message: "bad response", HTTPStatus: 500}
53+
ErrWebrpcServerPanic = WebRPCError{Code: -6, Name: "WebrpcServerPanic", Message: "server panic", HTTPStatus: 500}
54+
ErrWebrpcInternalError = WebRPCError{Code: -7, Name: "WebrpcInternalError", Message: "internal error", HTTPStatus: 500}
55+
)

parser.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gospeak
22

33
import (
4+
_ "embed"
45
"fmt"
56
"go/ast"
67
"go/token"
@@ -14,6 +15,9 @@ import (
1415
"golang.org/x/tools/go/packages"
1516
)
1617

18+
//go:embed errors.go
19+
var webrpcErrorsSourceCode string
20+
1721
type Target struct {
1822
Schema *schema.WebRPCSchema
1923
Generator string
@@ -43,16 +47,21 @@ func Parse(filePath string) ([]*Target, error) {
4347
Overlay: map[string][]byte{},
4448
}
4549

50+
packageLine := fmt.Sprintf("package %s", filepath.Base(dir))
51+
4652
// Make the parser ignore all previously generated Go files to avoid the
4753
// chicken-egg problem (ie. syntax errors in file we're currently generating).
4854
_ = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
4955
if err == nil && !info.IsDir() && strings.HasSuffix(path, ".gen.go") {
5056
// Overlay the source with an empty package name.
51-
cfg.Overlay[path] = []byte(fmt.Sprintf("package %s", filepath.Base(dir)))
57+
cfg.Overlay[path] = []byte(packageLine)
5258
}
5359
return nil
5460
})
5561

62+
errorsSourceCode := strings.Replace(webrpcErrorsSourceCode, "package gospeak", packageLine, 1)
63+
cfg.Overlay[dir+"/webrpcErrors.gen.go"] = []byte(errorsSourceCode)
64+
5665
pkgs, err := packages.Load(cfg, dir)
5766
if err != nil {
5867
return nil, fmt.Errorf("failed to load Go packages from %q: %w", dir, err)

0 commit comments

Comments
 (0)