-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathweaver_gen.go
155 lines (131 loc) · 3.91 KB
/
weaver_gen.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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package main
// Code generated by "weaver generate". DO NOT EDIT.
import (
"context"
"github.com/ServiceWeaver/weaver/runtime/codegen"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/trace"
"reflect"
"time"
)
func init() {
codegen.Register(codegen.Registration{
Name: "hello/Reverser",
Iface: reflect.TypeOf((*Reverser)(nil)).Elem(),
New: func() any { return &reverser{} },
LocalStubFn: func(impl any, tracer trace.Tracer) any {
return reverser_local_stub{impl: impl.(Reverser), tracer: tracer}
},
ClientStubFn: func(stub codegen.Stub, caller string) any {
return reverser_client_stub{stub: stub, reverseMetrics: codegen.MethodMetricsFor(codegen.MethodLabels{Caller: caller, Component: "hello/Reverser", Method: "Reverse"})}
},
ServerStubFn: func(impl any, addLoad func(uint64, float64)) codegen.Server {
return reverser_server_stub{impl: impl.(Reverser), addLoad: addLoad}
},
})
}
// Local stub implementations.
type reverser_local_stub struct {
impl Reverser
tracer trace.Tracer
}
func (s reverser_local_stub) Reverse(ctx context.Context, a0 string) (r0 string, err error) {
span := trace.SpanFromContext(ctx)
if span.SpanContext().IsValid() {
// Create a child span for this method.
ctx, span = s.tracer.Start(ctx, "main.Reverser.Reverse", trace.WithSpanKind(trace.SpanKindInternal))
defer func() {
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}
span.End()
}()
}
return s.impl.Reverse(ctx, a0)
}
// Client stub implementations.
type reverser_client_stub struct {
stub codegen.Stub
reverseMetrics *codegen.MethodMetrics
}
func (s reverser_client_stub) Reverse(ctx context.Context, a0 string) (r0 string, err error) {
// Update metrics.
start := time.Now()
s.reverseMetrics.Count.Add(1)
span := trace.SpanFromContext(ctx)
if span.SpanContext().IsValid() {
// Create a child span for this method.
ctx, span = s.stub.Tracer().Start(ctx, "main.Reverser.Reverse", trace.WithSpanKind(trace.SpanKindClient))
}
defer func() {
// Catch and return any panics detected during encoding/decoding/rpc.
if err == nil {
err = codegen.CatchPanics(recover())
}
err = s.stub.WrapError(err)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
s.reverseMetrics.ErrorCount.Add(1)
}
span.End()
s.reverseMetrics.Latency.Put(float64(time.Since(start).Microseconds()))
}()
// Preallocate a buffer of the right size.
size := 0
size += (4 + len(a0))
enc := codegen.NewEncoder()
enc.Reset(size)
// Encode arguments.
enc.String(a0)
var shardKey uint64
// Call the remote method.
s.reverseMetrics.BytesRequest.Put(float64(len(enc.Data())))
var results []byte
results, err = s.stub.Run(ctx, 0, enc.Data(), shardKey)
if err != nil {
return
}
s.reverseMetrics.BytesReply.Put(float64(len(results)))
// Decode the results.
dec := codegen.NewDecoder(results)
r0 = dec.String()
err = dec.Error()
return
}
// Server stub implementations.
type reverser_server_stub struct {
impl Reverser
addLoad func(key uint64, load float64)
}
// GetStubFn implements the stub.Server interface.
func (s reverser_server_stub) GetStubFn(method string) func(ctx context.Context, args []byte) ([]byte, error) {
switch method {
case "Reverse":
return s.reverse
default:
return nil
}
}
func (s reverser_server_stub) reverse(ctx context.Context, args []byte) (res []byte, err error) {
// Catch and return any panics detected during encoding/decoding/rpc.
defer func() {
if err == nil {
err = codegen.CatchPanics(recover())
}
}()
// Decode arguments.
dec := codegen.NewDecoder(args)
var a0 string
a0 = dec.String()
// TODO(rgrandl): The deferred function above will recover from panics in the
// user code: fix this.
// Call the local method.
r0, appErr := s.impl.Reverse(ctx, a0)
// Encode the results.
enc := codegen.NewEncoder()
enc.String(r0)
enc.Error(appErr)
return enc.Data(), nil
}