58 lines
3.0 KiB
Twig
58 lines
3.0 KiB
Twig
{% 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 -%} |