Skip to content

Commit 70284c1

Browse files
Merge pull request #1087 from appwrite/pla-3008
fix: enhance model property handling for array types in Swift template
2 parents 9c9a7db + 0c58f48 commit 70284c1

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

src/SDK/Language/Swift.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,9 @@ public function getFilters(): array
462462
new TwigFilter('propertyType', function (array $property, array $spec, string $generic = 'T') {
463463
return $this->getPropertyType($property, $spec, $generic);
464464
}),
465+
new TwigFilter('isAnyCodableArray', function (array $property, array $spec) {
466+
return $this->isAnyCodableArray($property, $spec);
467+
}),
465468
new TwigFilter('hasGenericType', function (string $model, array $spec) {
466469
return $this->hasGenericType($model, $spec);
467470
}),
@@ -533,6 +536,18 @@ protected function getPropertyType(array $property, array $spec, string $generic
533536
return $type;
534537
}
535538

539+
/**
540+
* Check if a property is an array that results in [AnyCodable] type
541+
*
542+
* @param array $property
543+
* @param array $spec
544+
* @return bool
545+
*/
546+
protected function isAnyCodableArray(array $property, array $spec): bool
547+
{
548+
return $property['type'] === 'array' && $this->getPropertyType($property, $spec, 'T') === '[AnyCodable]';
549+
}
550+
536551
protected function hasGenericType(?string $model, array $spec): string
537552
{
538553
if (empty($model) || $model === 'any') {

templates/swift/Sources/Models/Model.swift.twig

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,20 @@ open class {{ definition | modelType(spec) | raw }}: Codable {
8181
public static func from(map: [String: Any] ) -> {{ definition.name | caseUcfirst }} {
8282
return {{ definition.name | caseUcfirst }}(
8383
{%~ for property in definition.properties %}
84-
{{ property.name | escapeSwiftKeyword | removeDollarSign }}: {% if property.sub_schema %}{% if property.type == 'array' %}(map["{{property.name }}"] as! [[String: Any]]).map { {{property.sub_schema | caseUcfirst}}.from(map: $0) }{% else %}{{property.sub_schema | caseUcfirst}}.from(map: map["{{property.name }}"] as! [String: Any]){% endif %}{% else %}map["{{property.name }}"] as{% if property.required %}!{% else %}?{% endif %} {{ property | propertyType(spec) | raw }}{% endif %}{% if not loop.last or (loop.last and definition.additionalProperties) %},{% endif %}
84+
{%~ set isDocument = definition.name | lower == 'document' %}{# Temporary Fix until BE is fixed to return all attributes #}
85+
{{ property.name | escapeSwiftKeyword | removeDollarSign }}: {% if property.sub_schema -%}
86+
{%- if property.type == 'array' -%}
87+
(map["{{property.name }}"] as{% if isDocument %}?{% else %}{% if property.required %}!{% else %}?{% endif %}{% endif %} [[String: Any]]{% if isDocument %} ?? []{% elseif not property.required %} ?? []{% endif %}).map { {{property.sub_schema | caseUcfirst}}.from(map: $0) }
88+
{%- else -%}
89+
{% if isDocument %}map["{{property.name }}"] as? [String: Any] != nil ? {{property.sub_schema | caseUcfirst}}.from(map: map["{{property.name }}"] as! [String: Any]) : nil{% else %}{{property.sub_schema | caseUcfirst}}.from(map: map["{{property.name }}"] as! [String: Any]){% endif %}
90+
{%- endif -%}
91+
{%- else -%}
92+
{%- if property | isAnyCodableArray(spec) -%}
93+
(map["{{property.name }}"] as{% if isDocument %}?{% else %}{% if property.required %}!{% else %}?{% endif %}{% endif %} [Any]{% if isDocument or not property.required %} ?? []{% endif %}).map { AnyCodable($0) }
94+
{%- else -%}
95+
map["{{property.name }}"] as{% if isDocument %}?{% else %}{% if property.required %}!{% else %}?{% endif %}{% endif %} {{ property | propertyType(spec) | raw }}{% if isDocument and property.required %}{% if property.type == 'string' %} ?? ""{% elseif property.type == 'integer' %} ?? 0{% elseif property.type == 'number' %} ?? 0.0{% elseif property.type == 'boolean' %} ?? false{% elseif property.type == 'array' %} ?? []{% endif %}{% endif %}
96+
{%- endif -%}
97+
{%- endif %}{% if not loop.last or (loop.last and definition.additionalProperties) %},{% endif %}
8598

8699
{%~ endfor %}
87100
{%~ if definition.additionalProperties %}

0 commit comments

Comments
 (0)