{% macro decodeComplexField(field, decodingType) %} {%- import _self as self -%} {%- if field.optional or field.nullable -%} if let {{ field.name }} = try container.decodeIfPresent({{- decodingType -}}.self, forKey: .{{- field.name -}}) { {{ self.initExpr(field) }} } else { self.{{ field.name }} = nil } {%- else -%} let {{ field.name }} = try container.decode({{- decodingType -}}.self, forKey: .{{- field.name -}}) {{ self.initExpr(field) }} {%- endif -%} {% endmacro %} {% macro initExpr(field) %} {%- import _self as self -%} {%- set baseTypeName = field.type.type.baseTypeName -%} {%- if baseTypeName == "Date" or baseTypeName == "DateTime" -%} {{ self.commonDateInit(field) -}} {%- elseif baseTypeName == "Color" -%} {%- set colorInit = "UIColor(hexString: %s)"|format(field.name) -%} {{ self.decodeThrowableField(field, colorInit, 'Unable to decode color from hex string') -}} {%- elseif baseTypeName == "Url" -%} {%- set urlInit = "URL(string: %s)"|format(field.name) -%} {{ self.decodeThrowableField(field, urlInit, 'Unable to decode URL from string') -}} {%- elseif baseTypeName == "StringDecimal" -%} {%- set stringDecimalInit = "ApiNumberFormattingService.decimalNumber(from: %s, format: .decimal)"|format(field.name) -%} {{- self.decodeThrowableField(field, stringDecimalInit, 'Unable to decode decimal from string') -}} {%- elseif baseTypeName == "DateTimeTimestamp" -%} self.{{ field.name }} = DateInRegion(seconds: TimeInterval({{ field.name }})) {%- elseif baseTypeName == "Decimal" -%} self.{{ field.name }} = NSDecimalNumber(decimal: {{ field.name }}) {%- endif -%} {% endmacro %} {%- macro decodeThrowableField(field, init, errorMessage) -%} if let value = {{ init }} { self.{{ field.name }} = value } else { throw LeadKitError.failedToDecode(reason: "{{ errorMessage }}") } {%- endmacro -%} {%- macro commonDateInit(field) -%} {%- import _self as self -%} {%- if field.type.dateFormats is not empty -%} {%- set formattedDateFormats = [] -%} {%- for dateFormat in field.type.dateFormats -%} {%- set formattedDateFormats = formattedDateFormats|merge([".%s"|format(dateFormatToName(dateFormat))]) -%} {%- endfor -%} {%- set dateFormatsString = formattedDateFormats|join(', ') -%} {%- set dateInit = "ApiDateFormattingService.date(from: %s, formats: [%s], parsedIn: nil)"|format(field.name, dateFormatsString) -%} {{- self.decodeThrowableField(field, dateInit, "Unable to decode date from string") -}} {%- else -%} {%- set dateInit = "ApiDateFormattingService.date(from: %s, format: .%s, parsedIn: nil)"|format(field.name, dateFormatToName(field.type.dateFormat)) -%} {{- self.decodeThrowableField(field, dateInit, "Unable to decode date from string") -}} {%- endif -%} {%- endmacro -%}