-
Notifications
You must be signed in to change notification settings - Fork 101
/
server.go
124 lines (103 loc) · 3.44 KB
/
server.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// Code generated by thriftrw-plugin-yarpc
// @generated
package nameserver
import (
context "context"
stream "go.uber.org/thriftrw/protocol/stream"
wire "go.uber.org/thriftrw/wire"
transport "go.uber.org/yarpc/api/transport"
thrift "go.uber.org/yarpc/encoding/thrift"
extends "go.uber.org/yarpc/encoding/thrift/thriftrw-plugin-yarpc/internal/tests/extends"
yarpcerrors "go.uber.org/yarpc/yarpcerrors"
)
// Interface is the server-side interface for the Name service.
type Interface interface {
Name(
ctx context.Context,
) (string, error)
}
// New prepares an implementation of the Name service for
// registration.
//
// handler := NameHandler{}
// dispatcher.Register(nameserver.New(handler))
func New(impl Interface, opts ...thrift.RegisterOption) []transport.Procedure {
h := handler{impl}
service := thrift.Service{
Name: "Name",
Methods: []thrift.Method{
thrift.Method{
Name: "name",
HandlerSpec: thrift.HandlerSpec{
Type: transport.Unary,
Unary: thrift.UnaryHandler(h.Name),
NoWire: name_NoWireHandler{impl},
},
Signature: "Name() (string)",
ThriftModule: extends.ThriftModule,
},
},
}
procedures := make([]transport.Procedure, 0, 1)
procedures = append(procedures, thrift.BuildProcedures(service, opts...)...)
return procedures
}
type handler struct{ impl Interface }
type yarpcErrorNamer interface{ YARPCErrorName() string }
type yarpcErrorCoder interface{ YARPCErrorCode() *yarpcerrors.Code }
func (h handler) Name(ctx context.Context, body wire.Value) (thrift.Response, error) {
var args extends.Name_Name_Args
if err := args.FromWire(body); err != nil {
return thrift.Response{}, yarpcerrors.InvalidArgumentErrorf(
"could not decode Thrift request for service 'Name' procedure 'Name': %w", err)
}
success, appErr := h.impl.Name(ctx)
hadError := appErr != nil
result, err := extends.Name_Name_Helper.WrapResponse(success, appErr)
var response thrift.Response
if err == nil {
response.IsApplicationError = hadError
response.Body = result
if namer, ok := appErr.(yarpcErrorNamer); ok {
response.ApplicationErrorName = namer.YARPCErrorName()
}
if extractor, ok := appErr.(yarpcErrorCoder); ok {
response.ApplicationErrorCode = extractor.YARPCErrorCode()
}
if appErr != nil {
response.ApplicationErrorDetails = appErr.Error()
}
}
return response, err
}
type name_NoWireHandler struct{ impl Interface }
func (h name_NoWireHandler) HandleNoWire(ctx context.Context, nwc *thrift.NoWireCall) (thrift.NoWireResponse, error) {
var (
args extends.Name_Name_Args
rw stream.ResponseWriter
err error
)
rw, err = nwc.RequestReader.ReadRequest(ctx, nwc.EnvelopeType, nwc.Reader, &args)
if err != nil {
return thrift.NoWireResponse{}, yarpcerrors.InvalidArgumentErrorf(
"could not decode (via no wire) Thrift request for service 'Name' procedure 'Name': %w", err)
}
success, appErr := h.impl.Name(ctx)
hadError := appErr != nil
result, err := extends.Name_Name_Helper.WrapResponse(success, appErr)
response := thrift.NoWireResponse{ResponseWriter: rw}
if err == nil {
response.IsApplicationError = hadError
response.Body = result
if namer, ok := appErr.(yarpcErrorNamer); ok {
response.ApplicationErrorName = namer.YARPCErrorName()
}
if extractor, ok := appErr.(yarpcErrorCoder); ok {
response.ApplicationErrorCode = extractor.YARPCErrorCode()
}
if appErr != nil {
response.ApplicationErrorDetails = appErr.Error()
}
}
return response, err
}