From 4029ec54c4122dff7263578cf34836bb0801f09f Mon Sep 17 00:00:00 2001 From: Madhas Date: Tue, 22 May 2018 14:57:12 +0300 Subject: [PATCH] refactor utils for init from container --- Swift/macroses/common.utils.twig | 43 +++++++++++++++++++------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/Swift/macroses/common.utils.twig b/Swift/macroses/common.utils.twig index 6f27a7f..8b09920 100644 --- a/Swift/macroses/common.utils.twig +++ b/Swift/macroses/common.utils.twig @@ -36,35 +36,44 @@ {%- endif -%} {% endmacro %} -{% macro mappingFromMapForField(field, className, typeParameters) %} +{% macro decodeFromContainer(field) %} {%- import _self as self -%} - {%- if field.type.type.baseTypeName == "DateTime" -%} - map.value("{{ field.jsonName }}", using: {{ self.mappingTransformForField(field) -}}) - {%- elseif field.type.type.baseTypeName == "Decimal" -%} - map.value("{{ field.jsonName }}", using: NSDecimalNumberTransform()) - {%- elseif (self.fieldIsGeneric(field, typeParameters) != null) -%} - {{ field.type.type.baseTypeName }}.decode(from: map, key: "{{ field.jsonName }}") + {% if field.type.type.baseTypeName == "DateTime" %} + {{ self.decodeComplexField(field, "String") }} + {% elseif field.type.type.baseTypeName == "Decimal" %} + {{ self.decodeComplexField(field, "Decimal") }} {%- else -%} - map.value("{{ field.jsonName }}") + self.{{ field.name }} = {{ self.formatNullableOrOptional("try", field.nullable, field.optional) }} container.decode({{ self.formatValueType(field.type.type) }}.self, forKey: .{{ field.name }}) {%- endif -%} {% endmacro %} -{% macro mappingToMapForField(field, className, typeParameters) %} +{% macro decodeComplexField(field, decodingType) %} {%- import _self as self -%} - {%- if field.type.type.baseTypeName == "DateTime" -%} - {{ field.name }} >>> (map["{{ field.jsonName }}"], {{ self.mappingTransformForField(field) -}}) - {%- elseif (self.fieldIsGeneric(field, typeParameters) != null) -%} - {{ self.formatNullableOrOptional(field.name, field.nullable, field.optional) }}.encode(to: map, key: "{{ field.jsonName }}") + {%- if field.optional or field.nullable -%} + if let {{ field.name }} = try? container.decode({{ decodingType }}.self, forKey: .{{ field.name }}) { + {{ self.initExpr(field) }} + } else { + self.{{ field.name }} = nil + } {%- else -%} - {{ field.name }} >>> map["{{ field.jsonName }}"] + let {{ field.name }} = try container.decode({{ decodingType }}.self, forKey: .{{ field.name }}) + {{ self.initExpr(field) }} {%- endif -%} {% endmacro %} -{%- macro mappingTransformForField(field) -%} - ApiDateFormattingService.mappingTransform(with: .{{ dateFormatToName(field.type.dateFormat) }}) -{%- endmacro -%} +{% macro initExpr(field) %} + {%- if field.type.type.baseTypeName == "DateTime" -%} + if let date = DateInRegion(string: {{ field.name }}, format: ApiDateFormat.{{ dateFormatToName(field.type.dateFormat) }}.swiftDateFormat, fromRegion: ApiDateFormattingService.shared.currentRegion) { + self.{{ field.name }} = date + } else { + throw LeadKitError.failedToDecode(reason: "init?(string:format:fromRegion:) returned nil") + } + {%- elseif field.type.type.baseTypeName == "Decimal" -%} + self.{{ field.name }} = NSDecimalNumber(decimal: {{ field.name }}) + {%- endif -%} +{% endmacro %} {% macro enumValueName(value) %} {%- import _self as self -%}