212 lines
7.0 KiB
Twig
212 lines
7.0 KiB
Twig
{% macro decapitalize(text) %}
|
|
{{- concat(slice(text, 0, 1) | lower, slice(text, 1, text | length)) -}}
|
|
{% endmacro %}
|
|
|
|
{% macro capitalize(text) %}
|
|
{{- concat(slice(text, 0, 1) | upper, slice(text, 1, text | length)) -}}
|
|
{% endmacro %}
|
|
|
|
{% macro formatNullableOrOptional(expr, nullable, optional) %}
|
|
{{- expr -}}{%- if nullable or optional -%}?{%- endif -%}
|
|
{% endmacro %}
|
|
|
|
{% macro formatValueType(valueType) %}
|
|
{%- import _self as self -%}
|
|
|
|
{%- if valueType.baseTypeName == "Array" -%}
|
|
[{{ self.formatValueType(valueType.itemsType) }}]
|
|
{%- elseif valueType.baseTypeName == "Map" -%}
|
|
[{{ self.formatValueType(valueType.keysType) }}: {{ self.formatValueType(valueType.valuesType) }}]
|
|
{%- elseif valueType.baseTypeName == "DateTime" -%}
|
|
DateInRegion
|
|
{%- elseif valueType.baseTypeName == "Long" -%}
|
|
Int64
|
|
{%- elseif valueType.baseTypeName == "Decimal" -%}
|
|
NSDecimalNumber
|
|
{%- else -%}
|
|
{{ valueType.baseTypeName }}
|
|
{%- endif -%}
|
|
{% endmacro %}
|
|
|
|
{% macro formatEncodingValue(field, strong) %}
|
|
{%- import _self as self -%}
|
|
|
|
{%- if field.type.type.baseTypeName == "DateTime" -%}
|
|
{{- self.formatEncodingDate(field) -}}
|
|
{%- elseif field.type.type.baseTypeName == "Decimal" -%}
|
|
{%- if strong -%}
|
|
{{ field.name }}
|
|
{%- else -%}
|
|
{{ self.formatNullableOrOptional(field.name, field.nullable, field.optional) -}}
|
|
{%- endif -%}
|
|
.decimalValue
|
|
{%- else -%}
|
|
{{ field.name }}
|
|
{%- endif -%}
|
|
{% endmacro %}
|
|
|
|
{%- macro formatEncodingDate(field) -%}
|
|
ApiDateFormattingService.string(from: {{ field.name -}}, format: .{{- dateFormatToName(field.type.dateFormat) -}})
|
|
{%- endmacro -%}
|
|
|
|
{% macro escapeIfNeeded(expr) %}
|
|
{%- if expr == "default" -%}
|
|
`{{ expr }}`
|
|
{%- else -%}
|
|
{{ expr }}
|
|
{%- endif -%}
|
|
{% endmacro %}
|
|
|
|
{% macro encodeIfPresent(field) %}
|
|
{%- import _self as self -%}
|
|
|
|
{% if field.type.type.baseTypeName == "DateTime" %}
|
|
if let {{ field.name }} = {{ field.name }} {
|
|
try container.encode({{- self.formatEncodingDate(field) -}}, forKey: .{{- field.name -}})
|
|
}
|
|
{%- else -%}
|
|
try container.encodeIfPresent({{- self.formatEncodingValue(field, false) -}}, forKey: .{{- field.name -}})
|
|
{%- endif -%}
|
|
{% endmacro %}
|
|
|
|
{% macro encodeToContainer(field) %}
|
|
{%- import _self as self -%}
|
|
|
|
{%- if field.optional -%}
|
|
{{ self.encodeIfPresent(field) -}}
|
|
{%- elseif field.nullable -%}
|
|
if let {{ field.name }} = {{ field.name }} {
|
|
try container.encode({{- self.formatEncodingValue(field, true) -}}, forKey: .{{- field.name -}})
|
|
} else {
|
|
try container.encodeNil(forKey: .{{- field.name -}})
|
|
}
|
|
{%- else -%}
|
|
try container.encode({{- self.formatEncodingValue(field, false) -}}, forKey: .{{- field.name -}})
|
|
{%- endif -%}
|
|
{% endmacro %}
|
|
|
|
{% macro decodeFromContainer(field) %}
|
|
{%- import _self as self -%}
|
|
|
|
{% if field.type.type.baseTypeName == "DateTime" %}
|
|
{{ self.decodeComplexField(field, "String") }}
|
|
{% elseif field.type.type.baseTypeName == "Decimal" %}
|
|
{{ self.decodeComplexField(field, "Decimal") }}
|
|
{%- else -%}
|
|
self.{{ field.name }} = try container.{{- self.formatOptionalDecode(field) -}}({{ self.formatValueType(field.type.type) }}.self, forKey: .{{ field.name }})
|
|
{%- endif -%}
|
|
{% endmacro %}
|
|
|
|
{% 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 formatOptionalDecode(field) %}
|
|
{%- if field.optional or field.nullable -%}
|
|
decodeIfPresent
|
|
{%- else -%}
|
|
decode
|
|
{%- endif -%}
|
|
{% endmacro %}
|
|
|
|
{% macro initExpr(field) %}
|
|
{%- if field.type.type.baseTypeName == "DateTime" -%}
|
|
if let date = ApiDateFormattingService.date(from: {{ field.name }}, format: .{{ dateFormatToName(field.type.dateFormat) }}, parsedIn: nil) {
|
|
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 -%}
|
|
|
|
{{- self.decapitalize(value.name) -}}
|
|
{%- endmacro %}
|
|
|
|
{% macro defaultValueForField(field) %}
|
|
{%- set nullable = field.nullable -%}
|
|
{%- set optional = field.optional -%}
|
|
{%- set baseTypeName = field.type.type.baseTypeName -%}
|
|
|
|
{%- if nullable or optional -%}
|
|
nil
|
|
{%- elseif baseTypeName == "Array" -%}
|
|
[]
|
|
{%- elseif baseTypeName == "Map" -%}
|
|
[:]
|
|
{%- elseif baseTypeName == "String" -%}
|
|
""
|
|
{%- elseif baseTypeName == "DateTime" -%}
|
|
Date().inDefaultRegion()
|
|
{%- elseif baseTypeName == "Double" -%}
|
|
0.0
|
|
{%- elseif baseTypeName == "Long" or baseTypeName == "Int" -%}
|
|
0
|
|
{%- elseif baseTypeName == "Bool" -%}
|
|
false
|
|
{%- elseif baseTypeName == "Decimal" -%}
|
|
.zero
|
|
{%- elseif (field.type.values is not null) -%}
|
|
{%- import _self as self -%}
|
|
|
|
.{{ self.enumValueName(first(field.type.values)) }}
|
|
{%- else -%}
|
|
.new{{ baseTypeName }}
|
|
{%- endif -%}
|
|
{%- endmacro %}
|
|
|
|
{% macro valueTypeHasGenerics(valueType) %}
|
|
{%- if valueType.typeParameters is not empty -%}
|
|
{{ true }}
|
|
{%- elseif (valueType.parent is not null) -%}
|
|
{%- import _self as self -%}
|
|
|
|
{{- self.valueTypeHasGenerics(valueType.parent) -}}
|
|
{%- endif -%}
|
|
{% endmacro %}
|
|
|
|
{% macro hasGenericsOrNonEqutableCollections(type) %}
|
|
{%- set valueType = type.type -%}
|
|
|
|
{%- import _self as self -%}
|
|
|
|
{%- if self.valueTypeHasGenerics(valueType) != null -%}
|
|
{{ true }}
|
|
{%- elseif valueType.baseTypeName == "Array" -%}
|
|
{%- if (valueType.itemsType.typeParameters is not null) -%}
|
|
{{ true }}
|
|
{%- else -%}
|
|
{{- self.hasGenericsOrNonEqutableCollections(valueType.itemsType) -}}
|
|
{%- endif -%}
|
|
{%- elseif valueType.baseTypeName == "Map" -%}
|
|
{{ true }}
|
|
{%- elseif type.allFieldsOrdered is not null -%}
|
|
{%- for field in type.allFieldsOrdered -%}
|
|
{{- self.hasGenericsOrNonEqutableCollections(field.type) -}}
|
|
{%- endfor -%}
|
|
{%- endif -%}
|
|
{%- endmacro %}
|
|
|
|
{% macro fieldIsGeneric(field, typeParameters) %}
|
|
{%- for typeParameter in typeParameters -%}
|
|
{%- if typeParameter.baseTypeName == field.type.type.baseTypeName -%}
|
|
{{ true }}
|
|
{%- endif -%}
|
|
{%- endfor -%}
|
|
{% endmacro %}
|