Skip to content

Commit 00ca723

Browse files
committed
Add not supported exception for nullable optional parameters, amend docs, small improvements
1 parent c2d3b8c commit 00ca723

File tree

7 files changed

+57
-57
lines changed

7 files changed

+57
-57
lines changed

CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
66

77
## [10.1.0] - 2023.03.21
88
### Added
9-
- support for optional nullable properties
9+
- support for optional nullable scheme properties
1010

1111
## [10.0.1] - 2023.01.10
1212
### Added

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ API client generator is a console application capable of auto-generating a [PSR1
3232
- Applies code style rules to generated code, you can specify your own.
3333
- Generates README and composer.json files with possibility to use your own template.
3434
- Supports `allOf` OpenAPI parameter.
35-
- Supports nullable optional parameter.
35+
- Supports nullable optional scheme property.
3636

3737
## Example
3838
Check out [example](https://github.com/DoclerLabs/api-client-generator/tree/master/example) directory to see the code generated by api-client-generator.

src/Entity/OperationCollection.php

+3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ public function toArray(): array
3030
return $this->items;
3131
}
3232

33+
/**
34+
* @return ArrayIterator|Operation[]
35+
*/
3336
public function getIterator(): ArrayIterator
3437
{
3538
return new ArrayIterator($this->toArray());

src/Entity/RequestFieldRegistry.php

+9-3
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44

55
namespace DoclerLabs\ApiClientGenerator\Entity;
66

7-
use ArrayIterator;
87
use IteratorAggregate;
8+
use RecursiveArrayIterator;
9+
use RecursiveIteratorIterator;
910
use UnexpectedValueException;
1011

1112
class RequestFieldRegistry implements IteratorAggregate
@@ -80,8 +81,13 @@ public function getBody(): ?Field
8081
return current($this->items[self::ORIGIN_BODY]);
8182
}
8283

83-
public function getIterator(): ArrayIterator
84+
/**
85+
* @return RecursiveIteratorIterator|Field[]
86+
*/
87+
public function getIterator(): RecursiveIteratorIterator
8488
{
85-
return new ArrayIterator($this->items);
89+
return new RecursiveIteratorIterator(
90+
new RecursiveArrayIterator($this->items, RecursiveArrayIterator::CHILD_ARRAYS_ONLY)
91+
);
8692
}
8793
}

src/Generator/RequestGenerator.php

+36-39
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use DoclerLabs\ApiClientGenerator\Entity\Operation;
1111
use DoclerLabs\ApiClientGenerator\Entity\Request;
1212
use DoclerLabs\ApiClientGenerator\Generator\Security\SecurityStrategyAbstract;
13+
use DoclerLabs\ApiClientGenerator\Input\InvalidSpecificationException;
1314
use DoclerLabs\ApiClientGenerator\Input\Specification;
1415
use DoclerLabs\ApiClientGenerator\Naming\CopiedNamespace;
1516
use DoclerLabs\ApiClientGenerator\Naming\RequestNaming;
@@ -73,11 +74,9 @@ protected function generateRequest(
7374
protected function generateEnums(Request $request): array
7475
{
7576
$statements = [];
76-
foreach ($request->getFields() as $fields) {
77-
foreach ($fields as $field) {
78-
foreach ($this->generateEnumStatements($field) as $statement) {
79-
$statements[] = $statement;
80-
}
77+
foreach ($request->getFields() as $field) {
78+
foreach ($this->generateEnumStatements($field) as $statement) {
79+
$statements[] = $statement;
8180
}
8281
}
8382

@@ -87,20 +86,18 @@ protected function generateEnums(Request $request): array
8786
protected function generateProperties(Request $request, Operation $operation, Specification $specification): array
8887
{
8988
$statements = [];
90-
foreach ($request->getFields() as $fields) {
91-
foreach ($fields as $field) {
92-
if ($field->isComposite()) {
93-
$this->addImport(
94-
sprintf(
95-
'%s%s\\%s',
96-
$this->baseNamespace,
97-
SchemaGenerator::NAMESPACE_SUBPATH,
98-
$field->getPhpClassName()
99-
)
100-
);
101-
}
102-
$statements[] = $this->generateProperty($field);
89+
foreach ($request->getFields() as $field) {
90+
if ($field->isComposite()) {
91+
$this->addImport(
92+
sprintf(
93+
'%s%s\\%s',
94+
$this->baseNamespace,
95+
SchemaGenerator::NAMESPACE_SUBPATH,
96+
$field->getPhpClassName()
97+
)
98+
);
10399
}
100+
$statements[] = $this->generateProperty($field);
104101
}
105102

106103
$default = null;
@@ -123,26 +120,24 @@ protected function generateConstructor(
123120
): ?ClassMethod {
124121
$params = [];
125122
$paramInits = [];
126-
foreach ($request->getFields() as $fields) {
127-
foreach ($fields as $field) {
128-
if ($field->isRequired()) {
129-
array_push($paramInits, ...$this->generateValidationStmts($field));
123+
foreach ($request->getFields() as $field) {
124+
if ($field->isRequired()) {
125+
array_push($paramInits, ...$this->generateValidationStmts($field));
130126

131-
$param = $this->builder
132-
->param($field->getPhpVariableName())
133-
->setType($field->getPhpTypeHint(), $field->isNullable());
127+
$param = $this->builder
128+
->param($field->getPhpVariableName())
129+
->setType($field->getPhpTypeHint(), $field->isNullable());
134130

135-
if (null !== $field->getDefault()) {
136-
$param->setDefault($field->getDefault());
137-
}
131+
if (null !== $field->getDefault()) {
132+
$param->setDefault($field->getDefault());
133+
}
138134

139-
$params[] = $param->getNode();
135+
$params[] = $param->getNode();
140136

141-
$paramInits[] = $this->builder->assign(
142-
$this->builder->localPropertyFetch($field->getPhpVariableName()),
143-
$this->builder->var($field->getPhpVariableName())
144-
);
145-
}
137+
$paramInits[] = $this->builder->assign(
138+
$this->builder->localPropertyFetch($field->getPhpVariableName()),
139+
$this->builder->var($field->getPhpVariableName())
140+
);
146141
}
147142
}
148143

@@ -183,12 +178,14 @@ protected function generateConstructor(
183178
private function generateSetters(Request $request): array
184179
{
185180
$statements = [];
186-
foreach ($request->getFields() as $fields) {
187-
foreach ($fields as $field) {
188-
if (!$field->isRequired()) {
189-
$statements[] = $this->generateSet($field);
190-
}
181+
foreach ($request->getFields() as $field) {
182+
if ($field->isRequired()) {
183+
continue;
184+
}
185+
if ($field->isNullable()) {
186+
throw new InvalidSpecificationException('Nullable optional parameter is not supported');
191187
}
188+
$statements[] = $this->generateSet($field);
192189
}
193190

194191
return $statements;

src/Input/Parser.php

+2-4
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,8 @@ private function extractCompositeRequestFields(OperationCollection $operations):
4747
$allFields = new FieldCollection();
4848
foreach ($operations as $operation) {
4949
$request = $operation->getRequest();
50-
foreach ($request->getFields() as $fields) {
51-
foreach ($fields as $field) {
52-
$this->extractField($field, $allFields);
53-
}
50+
foreach ($request->getFields() as $field) {
51+
$this->extractField($field, $allFields);
5452
}
5553
}
5654

src/Input/Specification.php

+5-9
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,10 @@ public function getAllContentTypes(): array
123123

124124
public function requiresIntlExtension(): bool
125125
{
126-
/** @var Operation $operation */
127126
foreach ($this->getOperations() as $operation) {
128-
foreach ($operation->getRequest()->getFields() as $fields) {
129-
/** @var Field $field */
130-
foreach ($fields as $field) {
131-
if ($this->fieldRequiresIntlExtension($field)) {
132-
return true;
133-
}
127+
foreach ($operation->getRequest()->getFields() as $field) {
128+
if ($this->fieldRequiresIntlExtension($field)) {
129+
return true;
134130
}
135131
}
136132
}
@@ -172,8 +168,8 @@ private function fieldRequiresIntlExtension(Field $field): bool
172168
$field->isObject()
173169
&& !empty($field->getObjectProperties())
174170
) {
175-
foreach ($field->getObjectProperties() as $field) {
176-
if ($this->fieldRequiresIntlExtension($field)) {
171+
foreach ($field->getObjectProperties() as $objectProperty) {
172+
if ($this->fieldRequiresIntlExtension($objectProperty)) {
177173
return true;
178174
}
179175
}

0 commit comments

Comments
 (0)