generated from dogmatiq/template-go
/
method.go
87 lines (78 loc) 路 2.22 KB
/
method.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
package generator
import (
"github.com/dave/jennifer/jen"
"github.com/dogmatiq/protean/internal/generator/scope"
)
// appendMethod appends all generated code for an RPC method to the output.
func appendMethod(code *jen.File, s *scope.Method) {
appendRuntimeMethodImpl(code, s)
if s.MethodDesc.GetClientStreaming() && s.MethodDesc.GetServerStreaming() {
appendBidirectionalStreamingRuntimeCallConstructor(code, s)
appendBidirectionalStreamingRuntimeCallImpl(code, s)
} else if s.MethodDesc.GetClientStreaming() {
appendClientStreamingRuntimeCallConstructor(code, s)
appendClientStreamingRuntimeCallImpl(code, s)
} else if s.MethodDesc.GetServerStreaming() {
appendServerStreamingRuntimeCallConstructor(code, s)
appendServerStreamingRuntimeCallImpl(code, s)
} else {
appendUnaryRuntimeCallConstructor(code, s)
appendUnaryRuntimeCallImpl(code, s)
}
}
// appendRuntimeMethodImpl appends a generated implementation of runtime.Method
// to the output.
func appendRuntimeMethodImpl(code *jen.File, s *scope.Method) {
code.Commentf(
"%s is a runtime.Method implementation for the %s.%s.%s() method.",
s.RuntimeMethodImpl(),
s.FileDesc.GetPackage(),
s.ServiceDesc.GetName(),
s.MethodDesc.GetName(),
)
code.Type().
Id(s.RuntimeMethodImpl()).
Struct(
jen.Id("service").Id(s.ServiceInterface()),
)
recv := jen.Id("m").Op("*").Id(s.RuntimeMethodImpl())
code.Line()
code.Func().
Params(recv).
Id("Name").
Params().
Params(jen.String()).
Block(jen.Return(jen.Lit(s.MethodDesc.GetName())))
code.Line()
code.Func().
Params(recv).
Id("InputIsStream").
Params().
Params(jen.Bool()).
Block(jen.Return(jen.Lit(s.MethodDesc.GetClientStreaming())))
code.Line()
code.Func().
Params(recv).
Id("OutputIsStream").
Params().
Params(jen.Bool()).
Block(jen.Return(jen.Lit(s.MethodDesc.GetServerStreaming())))
code.Line()
code.Func().
Params(recv).
Id("NewCall").
Params(
jen.Id("ctx").Qual("context", "Context"),
jen.Id("interceptor").Qual(middlewarePackage, "ServerInterceptor"),
).
Params(
jen.Qual(runtimePackage, "Call"),
).
Block(jen.Return(
jen.Id(s.RuntimeCallConstructor()).Call(
jen.Id("ctx"),
jen.Id("m").Dot("service"),
jen.Id("interceptor"),
),
))
}