api-generator-templates/Swift/macroses/complexField.utils.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 -%}