/
controller.go
80 lines (69 loc) · 2.09 KB
/
controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package server
import (
"fmt"
"reflect"
"strings"
"github.com/lazygo/lazygo/utils"
)
// Controller 转为 server.HandlerFunc
func Controller(h any, methodName ...string) HandlerFunc {
rtServ, serviceName, err := routes.Make(h)
if err != nil {
panic(err)
}
var name string
if len(methodName) > 0 {
name = utils.ToSnakeString(methodName[0])
}
return func(ctx Context) error {
if name == "" {
routePath := strings.TrimRight(ctx.GetRoutePath(), "/")
index := strings.LastIndex(routePath, "/")
name = strings.TrimLeft(routePath[index:], "/")
}
method, ok := routes[serviceName][name]
if !ok {
return ErrNotFound.SetInternal(fmt.Errorf(" method name %s not found", name))
}
pReq := reflect.New(method.Request)
req := pReq.Interface().(Request)
defer req.Clear()
if err = ctx.Bind(req); err != nil {
return ErrBadRequest.SetInternal(fmt.Errorf("params error, req: %v, err: %v", req, err))
}
if err = req.Verify(); err != nil {
if he, ok := err.(*HTTPError); ok {
return he.SetInternal(fmt.Errorf("verify params fail, req: %v", req))
}
return ErrBadRequest.SetInternal(fmt.Errorf("params error, req: %v, err: %v", req, err))
}
pServ := reflect.New(rtServ)
pServ.Elem().FieldByName("Ctx").Set(reflect.ValueOf(ctx))
out := method.Method.Func.Call([]reflect.Value{pServ, pReq})
numOut := len(out)
if numOut == 1 {
if ierr := out[0].Interface(); ierr != nil {
if err = ierr.(error); err != nil {
if he, ok := err.(*HTTPError); ok {
return he.SetInternal(fmt.Errorf("request fail, req: %v", req))
}
return fmt.Errorf("request fail, req: %v, err: %w", req, err)
}
}
return nil
}
if numOut == 2 {
resp := out[0].Interface()
if ierr := out[1].Interface(); ierr != nil {
if err = ierr.(error); err != nil {
if he, ok := err.(*HTTPError); ok {
return he.SetInternal(fmt.Errorf("request fail, req: %v, resp: %v", req, resp))
}
return fmt.Errorf("request fail, req: %v, resp: %v, err: %w", req, resp, err)
}
}
return ctx.s().HTTPOKHandler(resp, ctx)
}
return ErrInternalServerError
}
}