19
19
import java .util .Map ;
20
20
import software .amazon .smithy .aws .traits .ServiceTrait ;
21
21
import software .amazon .smithy .aws .traits .auth .SigV4Trait ;
22
- import software .amazon .smithy .build .FileManifest ;
23
22
import software .amazon .smithy .model .Model ;
24
23
import software .amazon .smithy .model .node .ObjectNode ;
25
24
import software .amazon .smithy .model .shapes .ServiceShape ;
26
25
import software .amazon .smithy .rulesengine .traits .EndpointRuleSetTrait ;
27
26
import software .amazon .smithy .typescript .codegen .CodegenUtils ;
27
+ import software .amazon .smithy .typescript .codegen .TypeScriptDelegator ;
28
+ import software .amazon .smithy .typescript .codegen .TypeScriptDependency ;
28
29
import software .amazon .smithy .typescript .codegen .TypeScriptSettings ;
29
- import software .amazon .smithy .typescript .codegen .TypeScriptWriter ;
30
30
import software .amazon .smithy .utils .SmithyInternalApi ;
31
31
32
32
/**
36
36
public final class EndpointsV2Generator implements Runnable {
37
37
38
38
static final String ENDPOINT_FOLDER = "endpoint" ;
39
+ static final String ENDPOINT_PARAMETERS_FILE = "EndpointParameters.ts" ;
40
+ static final String ENDPOINT_RESOLVER_FILE = "endpointResolver.ts" ;
41
+ static final String ENDPOINT_RULESET_FILE = "ruleset.ts" ;
39
42
40
- private final FileManifest fileManifest ;
43
+ private final TypeScriptDelegator delegator ;
41
44
private final EndpointRuleSetTrait endpointRuleSetTrait ;
42
45
private final ServiceShape service ;
43
46
44
47
public EndpointsV2Generator (
48
+ TypeScriptDelegator delegator ,
45
49
TypeScriptSettings settings ,
46
- Model model ,
47
- FileManifest fileManifest
50
+ Model model
48
51
) {
49
- this .fileManifest = fileManifest ;
52
+ this .delegator = delegator ;
50
53
service = settings .getService (model );
51
54
endpointRuleSetTrait = service .getTrait (EndpointRuleSetTrait .class )
52
55
.orElseThrow (() -> new RuntimeException ("service missing EndpointRuleSetTrait" ));
@@ -63,140 +66,139 @@ public void run() {
63
66
* Generate the EndpointParameters interface file specific to this service.
64
67
*/
65
68
private void generateEndpointParameters () {
66
- TypeScriptWriter writer = new TypeScriptWriter ("" );
69
+ this .delegator .useFileWriter (
70
+ Paths .get (CodegenUtils .SOURCE_FOLDER , ENDPOINT_FOLDER , ENDPOINT_PARAMETERS_FILE ).toString (),
71
+ writer -> {
72
+ writer .addImport ("EndpointParameters" , "__EndpointParameters" , "@aws-sdk/types" );
73
+ writer .addImport ("Provider" , null , "@aws-sdk/types" );
67
74
68
- writer .addImport ("EndpointParameters" , "__EndpointParameters" , "@aws-sdk/types" );
69
- writer .addImport ("Provider" , null , "@aws-sdk/types" );
75
+ writer .openBlock (
76
+ "export interface ClientInputEndpointParameters {" ,
77
+ "}" ,
78
+ () -> {
79
+ RuleSetParameterFinder ruleSetParameterFinder = new RuleSetParameterFinder (service );
70
80
71
- writer .openBlock (
72
- "export interface ClientInputEndpointParameters {" ,
73
- "}" ,
74
- () -> {
75
- RuleSetParameterFinder ruleSetParameterFinder = new RuleSetParameterFinder (service );
81
+ Map <String , String > clientInputParams = ruleSetParameterFinder .getClientContextParams ();
82
+ clientInputParams .putAll (ruleSetParameterFinder .getBuiltInParams ());
76
83
77
- Map <String , String > clientInputParams = ruleSetParameterFinder .getClientContextParams ();
78
- clientInputParams .putAll (ruleSetParameterFinder .getBuiltInParams ());
84
+ ObjectNode ruleSet = endpointRuleSetTrait .getRuleSet ().expectObjectNode ();
85
+ ruleSet .getObjectMember ("parameters" ).ifPresent (parameters -> {
86
+ parameters .accept (new RuleSetParametersVisitor (writer , clientInputParams , true ));
87
+ });
88
+ }
89
+ );
79
90
80
- ObjectNode ruleSet = endpointRuleSetTrait .getRuleSet ().expectObjectNode ();
81
- ruleSet .getObjectMember ("parameters" ).ifPresent (parameters -> {
82
- parameters .accept (new RuleSetParametersVisitor (writer , clientInputParams , true ));
83
- });
84
- }
85
- );
91
+ writer .write ("" );
92
+ writer .openBlock (
93
+ "export type ClientResolvedEndpointParameters = ClientInputEndpointParameters & {" ,
94
+ "};" ,
95
+ () -> {
96
+ writer .write ("defaultSigningName: string;" );
97
+ }
98
+ );
99
+ writer .write ("" );
86
100
87
- writer .write ("" );
88
- writer .openBlock (
89
- "export type ClientResolvedEndpointParameters = ClientInputEndpointParameters & {" ,
90
- "};" ,
91
- () -> {
92
- writer .write ("defaultSigningName: string;" );
93
- }
94
- );
95
- writer .write ("" );
96
-
97
- writer .openBlock (
98
- "export const resolveClientEndpointParameters = "
99
- + "<T>(options: T & ClientInputEndpointParameters"
100
- + "): T & ClientResolvedEndpointParameters => {" ,
101
- "}" ,
102
- () -> {
103
- writer .openBlock ("return {" , "}" , () -> {
104
- writer .write ("...options," );
105
- ObjectNode ruleSet = endpointRuleSetTrait .getRuleSet ().expectObjectNode ();
106
- ruleSet .getObjectMember ("parameters" ).ifPresent (parameters -> {
107
- parameters .accept (new RuleSetParametersVisitor (writer , true ));
108
- });
109
- ServiceTrait serviceTrait = service .getTrait (ServiceTrait .class ).get ();
110
- writer .write (
111
- "defaultSigningName: \" $L\" ," ,
112
- service .getTrait (SigV4Trait .class ).map (SigV4Trait ::getName )
113
- .orElse (serviceTrait .getArnNamespace ())
114
- );
115
- });
116
- }
117
- );
101
+ writer .openBlock (
102
+ "export const resolveClientEndpointParameters = "
103
+ + "<T>(options: T & ClientInputEndpointParameters"
104
+ + "): T & ClientResolvedEndpointParameters => {" ,
105
+ "}" ,
106
+ () -> {
107
+ writer .openBlock ("return {" , "}" , () -> {
108
+ writer .write ("...options," );
109
+ ObjectNode ruleSet = endpointRuleSetTrait .getRuleSet ().expectObjectNode ();
110
+ ruleSet .getObjectMember ("parameters" ).ifPresent (parameters -> {
111
+ parameters .accept (new RuleSetParametersVisitor (writer , true ));
112
+ });
113
+ ServiceTrait serviceTrait = service .getTrait (ServiceTrait .class ).get ();
114
+ writer .write (
115
+ "defaultSigningName: \" $L\" ," ,
116
+ service .getTrait (SigV4Trait .class ).map (SigV4Trait ::getName )
117
+ .orElse (serviceTrait .getArnNamespace ())
118
+ );
119
+ });
120
+ }
121
+ );
118
122
119
- writer .write ("" );
120
- writer .openBlock (
121
- "export interface EndpointParameters extends __EndpointParameters {" ,
122
- "}" ,
123
- () -> {
124
- ObjectNode ruleSet = endpointRuleSetTrait .getRuleSet ().expectObjectNode ();
125
- ruleSet .getObjectMember ("parameters" ).ifPresent (parameters -> {
126
- parameters .accept (new RuleSetParametersVisitor (writer ));
127
- });
123
+ writer .write ("" );
124
+ writer .openBlock (
125
+ "export interface EndpointParameters extends __EndpointParameters {" ,
126
+ "}" ,
127
+ () -> {
128
+ ObjectNode ruleSet = endpointRuleSetTrait .getRuleSet ().expectObjectNode ();
129
+ ruleSet .getObjectMember ("parameters" ).ifPresent (parameters -> {
130
+ parameters .accept (new RuleSetParametersVisitor (writer ));
131
+ });
132
+ }
133
+ );
128
134
}
129
135
);
130
-
131
- fileManifest .writeFile (
132
- Paths .get (CodegenUtils .SOURCE_FOLDER , ENDPOINT_FOLDER , "EndpointParameters.ts" ).toString (),
133
- writer .toString ()
134
- );
135
136
}
136
137
137
138
/**
138
139
* Generate the resolver function for this service.
139
140
*/
140
141
private void generateEndpointResolver () {
141
- TypeScriptWriter writer = new TypeScriptWriter ("" );
142
-
143
- writer .addImport ("EndpointV2" , null , "@aws-sdk/types" );
144
- writer .addImport ("Logger" , null , "@aws-sdk/types" );
142
+ this .delegator .useFileWriter (
143
+ Paths .get (CodegenUtils .SOURCE_FOLDER , ENDPOINT_FOLDER , ENDPOINT_RESOLVER_FILE ).toString (),
144
+ writer -> {
145
+ writer .addImport ("EndpointV2" , null , "@aws-sdk/types" );
146
+ writer .addImport ("Logger" , null , "@aws-sdk/types" );
147
+
148
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_ENDPOINTS );
149
+ writer .addImport ("EndpointParams" , null , TypeScriptDependency .AWS_SDK_UTIL_ENDPOINTS .packageName );
150
+ writer .addImport ("resolveEndpoint" , null , TypeScriptDependency .AWS_SDK_UTIL_ENDPOINTS .packageName );
151
+ writer .addImport ("EndpointParameters" , null ,
152
+ Paths .get ("." , CodegenUtils .SOURCE_FOLDER , ENDPOINT_FOLDER ,
153
+ ENDPOINT_PARAMETERS_FILE .replace (".ts" , "" )).toString ());
154
+ writer .addImport ("ruleSet" , null ,
155
+ Paths .get ("." , CodegenUtils .SOURCE_FOLDER , ENDPOINT_FOLDER ,
156
+ ENDPOINT_RULESET_FILE .replace (".ts" , "" )).toString ());
145
157
146
- writer .addImport ("EndpointParams" , null , "@aws-sdk/util-endpoints" );
147
- writer .addImport ("resolveEndpoint" , null , "@aws-sdk/util-endpoints" );
148
- writer .addImport ("EndpointParameters" , null , "../endpoint/EndpointParameters" );
149
- writer .addImport ("ruleSet" , null , "../endpoint/ruleset" );
150
-
151
- writer .openBlock (
152
- "export const defaultEndpointResolver = " ,
153
- "" ,
154
- () -> {
155
158
writer .openBlock (
156
- "(endpointParams: EndpointParameters, context: { logger?: Logger } = {}): EndpointV2 => { " ,
157
- "}; " ,
159
+ "export const defaultEndpointResolver = " ,
160
+ "" ,
158
161
() -> {
159
162
writer .openBlock (
160
- "return resolveEndpoint(ruleSet, {" ,
161
- "}) ;" ,
163
+ "(endpointParams: EndpointParameters, context: { logger?: Logger } = {}): EndpointV2 => {" ,
164
+ "};" ,
162
165
() -> {
163
- writer .write ("endpointParams: endpointParams as EndpointParams," );
164
- writer .write ("logger: context.logger," );
166
+ writer .openBlock (
167
+ "return resolveEndpoint(ruleSet, {" ,
168
+ "});" ,
169
+ () -> {
170
+ writer .write ("endpointParams: endpointParams as EndpointParams," );
171
+ writer .write ("logger: context.logger," );
172
+ }
173
+ );
165
174
}
166
175
);
167
176
}
168
177
);
169
178
}
170
179
);
171
-
172
- fileManifest .writeFile (
173
- Paths .get (CodegenUtils .SOURCE_FOLDER , ENDPOINT_FOLDER , "endpointResolver.ts" ).toString (),
174
- writer .toString ()
175
- );
176
180
}
177
181
178
182
/**
179
183
* Generate the ruleset (dynamic resolution only).
180
184
*/
181
185
private void generateEndpointRuleset () {
182
- TypeScriptWriter writer = new TypeScriptWriter ( "" );
183
-
184
- writer . addImport ( "RuleSetObject" , null , "@aws-sdk/util-endpoints" );
185
-
186
- writer .openBlock (
187
- "export const ruleSet: RuleSetObject = " ,
188
- "" ,
189
- () -> {
190
- new RuleSetSerializer (
191
- endpointRuleSetTrait .getRuleSet (),
192
- writer
193
- ).generate ();
194
- }
195
- );
186
+ this . delegator . useFileWriter (
187
+ Paths . get ( CodegenUtils . SOURCE_FOLDER , ENDPOINT_FOLDER , ENDPOINT_RULESET_FILE ). toString (),
188
+ writer -> {
189
+ writer . addImport ( "RuleSetObject" , null , "@aws-sdk/util-endpoints" );
190
+ writer .openBlock (
191
+ "export const ruleSet: RuleSetObject = " ,
192
+ "" ,
193
+ () -> {
194
+ new RuleSetSerializer (
195
+ endpointRuleSetTrait .getRuleSet (),
196
+ writer
197
+ ).generate ();
198
+ }
199
+ );
196
200
197
- fileManifest .writeFile (
198
- Paths .get (CodegenUtils .SOURCE_FOLDER , ENDPOINT_FOLDER , "ruleset.ts" ).toString (),
199
- writer .toString ()
201
+ }
200
202
);
201
203
}
202
204
}
0 commit comments