15
15
16
16
package software .amazon .smithy .typescript .codegen ;
17
17
18
- import java .util .LinkedHashSet ;
18
+ import java .util .Iterator ;
19
19
import java .util .Set ;
20
20
import software .amazon .smithy .codegen .core .Symbol ;
21
21
import software .amazon .smithy .codegen .core .SymbolProvider ;
22
22
import software .amazon .smithy .model .shapes .OperationShape ;
23
23
import software .amazon .smithy .model .shapes .ServiceShape ;
24
- import software .amazon .smithy .utils . StringUtils ;
24
+ import software .amazon .smithy .model . shapes . Shape ;
25
25
26
26
final class ServerGenerator {
27
27
28
28
private ServerGenerator () {}
29
29
30
- static void generateServiceHandler (ServiceShape service ,
30
+ static void generateOperationsType (SymbolProvider symbolProvider ,
31
+ Shape serviceShape ,
32
+ Set <OperationShape > operations ,
33
+ TypeScriptWriter writer ) {
34
+ Symbol serviceSymbol = symbolProvider .toSymbol (serviceShape );
35
+ writer .writeInline ("type $L = " , serviceSymbol .expectProperty ("operations" , Symbol .class ).getName ());
36
+ for (Iterator <OperationShape > iter = operations .iterator (); iter .hasNext ();) {
37
+ writer .writeInline ("$S" , iter .next ().getId ().getName ());
38
+ if (iter .hasNext ()) {
39
+ writer .writeInline (" | " );
40
+ }
41
+ }
42
+ writer .write (";" );
43
+ }
44
+
45
+ static void generateServiceHandler (SymbolProvider symbolProvider ,
46
+ Shape serviceShape ,
31
47
Set <OperationShape > operations ,
32
48
TypeScriptWriter writer ) {
33
49
writer .addImport ("ServiceHandler" , null , "@aws-smithy/server-common" );
@@ -42,17 +58,15 @@ static void generateServiceHandler(ServiceShape service,
42
58
writer .addImport ("HttpRequest" , null , "@aws-sdk/protocol-http" );
43
59
writer .addImport ("HttpResponse" , null , "@aws-sdk/protocol-http" );
44
60
45
- String serviceName = StringUtils .capitalize (service .getId ().getName ());
46
- String operationsTypeName = serviceName + "Operations" ;
47
-
48
- writer .addImport (serviceName + "Service" , null , "." );
49
- writer .write ("type $L = keyof $L;" , operationsTypeName , serviceName + "Service" );
61
+ Symbol serviceSymbol = symbolProvider .toSymbol (serviceShape );
62
+ Symbol handlerSymbol = serviceSymbol .expectProperty ("handler" , Symbol .class );
63
+ Symbol operationsType = serviceSymbol .expectProperty ("operations" , Symbol .class );
50
64
51
- writer .openBlock ("export class $LServiceHandler implements ServiceHandler {" , "}" , serviceName , () -> {
52
- writer .write ("private service: $LService ;" , serviceName );
53
- writer .write ("private mux: Mux<$S, $L >;" , serviceName , operationsTypeName );
54
- writer .write ("private serializers: Record<$1L , OperationSerializer<$2LService , $1L >>;" ,
55
- operationsTypeName , serviceName );
65
+ writer .openBlock ("export class $L implements ServiceHandler {" , "}" , handlerSymbol . getName () , () -> {
66
+ writer .write ("private service: $T ;" , serviceSymbol );
67
+ writer .write ("private mux: Mux<$S, $T >;" , serviceShape . getId (). getName (), operationsType );
68
+ writer .write ("private serializers: Record<$1T , OperationSerializer<$2L , $1T >>;" ,
69
+ operationsType , serviceSymbol . getName () );
56
70
writer .openBlock ("private serdeContextBase = {" , "};" , () -> {
57
71
writer .write ("base64Encoder: toBase64," );
58
72
writer .write ("base64Decoder: fromBase64," );
@@ -63,19 +77,19 @@ static void generateServiceHandler(ServiceShape service,
63
77
writer .write ("disableHostPrefix: true" );
64
78
});
65
79
writer .write ("/**" );
66
- writer .write (" * Construct a $LService handler." , serviceName );
67
- writer .write (" * @param service The {@link $LService } implementation that supplies" , serviceName );
68
- writer .write (" * the business logic for $LService " , serviceName );
80
+ writer .write (" * Construct a $T handler." , serviceSymbol );
81
+ writer .write (" * @param service The {@link $T } implementation that supplies" , serviceSymbol );
82
+ writer .write (" * the business logic for $T " , serviceSymbol );
69
83
writer .write (" * @param mux The {@link Mux} that determines which service and operation are being" );
70
84
writer .write (" * invoked by a given {@link HttpRequest}" );
71
85
writer .write (" * @param serializers An {@link OperationSerializer} for each operation in" );
72
- writer .write (" * $LService that handles deserialization of requests and " , serviceName );
73
- writer .write (" * serialization of responses" );
86
+ writer .write (" * $T that handles deserialization of requests" , serviceSymbol );
87
+ writer .write (" * and serialization of responses" );
74
88
writer .write (" */" );
75
- writer .openBlock ("constructor(service: $1LService , "
76
- + "mux: Mux<$1S , $2L >, "
77
- + "serializers: Record<$2L , OperationSerializer<$1LService , $2L >>) {" , "}" ,
78
- serviceName , operationsTypeName , () -> {
89
+ writer .openBlock ("constructor(service: $1T , "
90
+ + "mux: Mux<$3S , $2T >, "
91
+ + "serializers: Record<$2T , OperationSerializer<$1T , $2T >>) {" , "}" ,
92
+ serviceSymbol , operationsType , serviceShape . getId (). getName () , () -> {
79
93
writer .write ("this.service = service;" );
80
94
writer .write ("this.mux = mux;" );
81
95
writer .write ("this.serializers = serializers;" );
@@ -88,22 +102,25 @@ static void generateServiceHandler(ServiceShape service,
88
102
});
89
103
writer .openBlock ("switch (target.operation) {" , "}" , () -> {
90
104
for (OperationShape operation : operations ) {
91
- generateHandlerCase (writer , serviceName , operation );
105
+ generateHandlerCase (writer , serviceSymbol , operation , symbolProvider . toSymbol ( operation ) );
92
106
}
93
107
});
94
108
});
95
109
});
96
110
}
97
111
98
- private static void generateHandlerCase (TypeScriptWriter writer , String serviceName , OperationShape operation ) {
99
- String opName = operation .getId ().getName ();
112
+ private static void generateHandlerCase (TypeScriptWriter writer ,
113
+ Symbol serviceSymbol ,
114
+ Shape operationShape ,
115
+ Symbol operationSymbol ) {
116
+ String opName = operationShape .getId ().getName ();
100
117
writer .openBlock ("case $S : {" , "}" , opName , () -> {
101
- writer .write ("let serializer = this.serializers.$1L as OperationSerializer<$2LService , $1S >;" ,
102
- opName , serviceName );
118
+ writer .write ("let serializer = this.serializers.$2L as OperationSerializer<$1L , $2S >;" ,
119
+ serviceSymbol . getName (), opName );
103
120
writer .openBlock ("let input = await serializer.deserialize(request, {" , "});" , () -> {
104
121
writer .write ("endpoint: () => Promise.resolve(request), ...this.serdeContextBase" );
105
122
});
106
- writer .write ("let output = this.service.$L(input, request);" , opName );
123
+ writer .write ("let output = this.service.$L(input, request);" , operationSymbol . getName () );
107
124
writer .write ("return serializer.serialize(output, this.serdeContextBase);" );
108
125
});
109
126
}
@@ -114,41 +131,16 @@ static void generateServerInterfaces(SymbolProvider symbolProvider,
114
131
TypeScriptWriter writer ) {
115
132
writer .addImport ("Operation" , "__Operation" , "@aws-smithy/server-common" );
116
133
117
- String serviceInterfaceName = StringUtils . capitalize (service . getId ( ).getName ()) + "Service" ;
134
+ String serviceInterfaceName = symbolProvider . toSymbol (service ).getName ();
118
135
119
136
writer .openBlock ("export interface $L {" , "}" , serviceInterfaceName , () -> {
120
137
for (OperationShape operation : operations ) {
121
138
Symbol symbol = symbolProvider .toSymbol (operation );
122
- writer .write ("$L: $L<$T, $T>" , StringUtils . capitalize ( operation . getId (). getName () ),
139
+ writer .write ("$L: $L<$T, $T>" , symbol . getName (),
123
140
"__Operation" ,
124
141
symbol .expectProperty ("inputType" , Symbol .class ),
125
142
symbol .expectProperty ("outputType" , Symbol .class ));
126
143
}
127
144
});
128
-
129
- writer .addImport ("ParsedRequest" , "__ParsedRequest" , "@aws-smithy/server-common" );
130
- writer .addImport ("PreparedResponse" , "__PreparedResponse" , "@aws-smithy/server-common" );
131
-
132
- Set <String > requestInterfaces = new LinkedHashSet <>();
133
- Set <String > responseInterfaces = new LinkedHashSet <>();
134
- for (OperationShape operation : operations ) {
135
- String opName = StringUtils .capitalize (operation .getId ().getName ());
136
- String requestInterfaceName = "Parsed" + opName + "Request" ;
137
- String responseInterfaceName = "Prepared" + opName + "Response" ;
138
-
139
- writer .write ("export interface $L extends $L<$L, $S> {}" ,
140
- requestInterfaceName , "__ParsedRequest" , serviceInterfaceName , opName );
141
- writer .write ("export interface $L extends $L<$L, $S> {}" ,
142
- responseInterfaceName , "__PreparedResponse" , serviceInterfaceName , opName );
143
-
144
- requestInterfaces .add (requestInterfaceName );
145
- responseInterfaces .add (responseInterfaceName );
146
- }
147
-
148
- writer .write ("export type $LRequests = $L;" ,
149
- serviceInterfaceName , String .join (" | " , requestInterfaces ));
150
-
151
- writer .write ("export type $LResponses = $L;" ,
152
- serviceInterfaceName , String .join (" | " , responseInterfaces ));
153
145
}
154
146
}
0 commit comments