Skip to content

Commit b98e4a5

Browse files
Implement EC2 client (#2064)
* Implement EC2 client * Applied corrections * Bump aliases
1 parent 88eb11c commit b98e4a5

7 files changed

Lines changed: 68 additions & 3 deletions

File tree

src/Definition/ServiceDefinition.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
class ServiceDefinition
1717
{
18-
private const SUPPORTED_PROTOCOLS = ['json', 'rest-json', 'query', 'rest-xml'];
18+
private const SUPPORTED_PROTOCOLS = ['ec2', 'json', 'rest-json', 'query', 'rest-xml'];
1919

2020
/**
2121
* @var string

src/Generator/ClientGenerator.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ public function getVersion() {
261261
$errorFactory = $customErrorFactory;
262262
} else {
263263
switch ($definition->getProtocol()) {
264+
case 'ec2':
264265
case 'query':
265266
case 'rest-xml':
266267
$errorFactory = XmlAwsErrorFactory::class;
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AsyncAws\CodeGenerator\Generator\RequestSerializer;
6+
7+
use AsyncAws\CodeGenerator\Definition\ListShape;
8+
use AsyncAws\CodeGenerator\Definition\MapShape;
9+
use AsyncAws\CodeGenerator\Definition\Member;
10+
use AsyncAws\CodeGenerator\Definition\StructureMember;
11+
12+
/**
13+
* EC2 wire-format variant of the query protocol.
14+
*
15+
* Differences vs standard query:
16+
* - Lists are encoded as `Parent.$index` — no `.member` infix, the list-member
17+
* locationName is ignored, and the flattened/non-flattened distinction is
18+
* irrelevant (every list serializes positionally).
19+
* - Structure-member names prefer `queryName` verbatim, else `ucfirst(locationName)`,
20+
* else the PHP key (already PascalCase in AWS EC2 models).
21+
*
22+
* Mirrors aws-sdk-php's `Aws\Api\Serializer\Ec2ParamBuilder`.
23+
*
24+
* @internal
25+
*/
26+
class Ec2QuerySerializer extends QuerySerializer
27+
{
28+
protected function getQueryName(Member $member, string $default): string
29+
{
30+
if (null !== $member->getQueryName()) {
31+
return $member->getQueryName();
32+
}
33+
if (null !== $locationName = $member->getLocationName()) {
34+
return ucfirst($locationName);
35+
}
36+
37+
return $default;
38+
}
39+
40+
protected function getName(Member $member): string
41+
{
42+
if (!$member instanceof StructureMember) {
43+
throw new \RuntimeException('Guessing the name for this member is not yet implemented');
44+
}
45+
46+
$name = $this->getQueryName($member, $member->getName());
47+
$shape = $member->getShape();
48+
49+
if ($shape instanceof ListShape) {
50+
return $name;
51+
}
52+
53+
if ($shape instanceof MapShape) {
54+
return $name . ($shape->isFlattened() ? '' : '.entry');
55+
}
56+
57+
return $name;
58+
}
59+
}

src/Generator/RequestSerializer/QuerySerializer.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ public function getRequestBuilderExtraArguments(): array
146146
return [];
147147
}
148148

149-
private function getQueryName(Member $member, string $default): string
149+
protected function getQueryName(Member $member, string $default): string
150150
{
151151
if (null !== $member->getQueryName()) {
152152
return $member->getQueryName();
@@ -162,7 +162,7 @@ private function getQueryName(Member $member, string $default): string
162162
return $default;
163163
}
164164

165-
private function getName(Member $member): string
165+
protected function getName(Member $member): string
166166
{
167167
if ($member instanceof StructureMember) {
168168
$name = $this->getQueryName($member, $member->getName());

src/Generator/RequestSerializer/SerializerProvider.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ public function get(ServiceDefinition $definition): Serializer
4242
return new RestJsonSerializer($this->namespaceRegistry, $this->requirementsRegistry);
4343
case 'query':
4444
return new QuerySerializer($this->namespaceRegistry, $this->requirementsRegistry);
45+
case 'ec2':
46+
return new Ec2QuerySerializer($this->namespaceRegistry, $this->requirementsRegistry);
4547
case 'json':
4648
return new JsonRpcSerializer($this->namespaceRegistry, $this->requirementsRegistry);
4749
default:

src/Generator/ResponseParser/ParserProvider.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public function __construct(NamespaceRegistry $namespaceRegistry, RequirementsRe
4343
public function get(ServiceDefinition $definition): Parser
4444
{
4545
switch ($definition->getProtocol()) {
46+
case 'ec2':
4647
case 'query':
4748
case 'rest-xml':
4849
return new RestXmlParser($this->namespaceRegistry, $this->requirementsRegistry, $this->typeGenerator);

src/Generator/TestGenerator.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ private function generateInput(Operation $operation, StructureShape $shape): voi
102102
$contentType = 'application/x-amz-json-' . number_format($operation->getService()->getJsonVersion(), 1);
103103

104104
break;
105+
case 'ec2':
105106
case 'query':
106107
$stub = substr(var_export($exampleInput ? http_build_query($exampleInput, '', '&', \PHP_QUERY_RFC3986) : "
107108
Action={$operation->getName()}
@@ -171,6 +172,7 @@ private function generateResult(Operation $operation, StructureShape $shape): vo
171172
$exampleOutput = $operation->getExample()->getOutput();
172173
$comment = $exampleOutput ? '// see example-1.json from SDK' : '// see ' . $operation->getApiReferenceDocumentationUrl();
173174
switch ($operation->getService()->getProtocol()) {
175+
case 'ec2':
174176
case 'rest-xml':
175177
case 'query':
176178
$stub = \sprintf('$response = new SimpleMockedResponse(%s);', var_export($this->arrayToXml($exampleOutput ?? ['change' => 'it']), true));

0 commit comments

Comments
 (0)