api-generator-templates/Swift/macroses/common.utils.twig

219 lines
7.9 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 -%}
{%- set baseTypeName = valueType.baseTypeName -%}
{%- if baseTypeName == "Array" -%}
[{{ self.formatValueType(valueType.itemsType) }}]
{%- elseif baseTypeName == "Map" -%}
[{{ self.formatValueType(valueType.keysType) }}: {{ self.formatValueType(valueType.valuesType) }}]
{%- elseif baseTypeName == "Date" or baseTypeName == "DateTime" or baseTypeName == "DateTimeTimestamp" -%}
DateInRegion
{%- elseif baseTypeName == "Long" -%}
Int64
{%- elseif baseTypeName == "Decimal" or baseTypeName == "StringDecimal" -%}
NSDecimalNumber
{%- elseif baseTypeName == "Url" -%}
URL
{%- elseif baseTypeName == "Color" -%}
UIColor
{%- else -%}
{{ baseTypeName }}
{%- endif -%}
{% endmacro %}
{% macro formatEncodingValue(field, isStrongLinkCaptured) %}
{%- import _self as self -%}
{%- set baseTypeName = field.type.type.baseTypeName -%}
{%- if baseTypeName == "Date" or baseTypeName == "DateTime" -%}
{{- self.formatEncodingDate(field) -}}
{%- elseif baseTypeName == "StringDecimal" -%}
{{- self.formatEncodingStringDecimal(field) -}}
{%- elseif baseTypeName == "Decimal" -%}
{{ self.formatFieldName(field, isStrongLinkCaptured) -}}.decimalValue
{%- elseif baseTypeName == "DateTimeTimestamp" -%}
Int({{ self.formatFieldName(field, isStrongLinkCaptured) -}}.timeIntervalSince1970)
{%- elseif baseTypeName == "Color" -%}
{{ self.formatFieldName(field, isStrongLinkCaptured) -}}.hexString
{%- elseif baseTypeName == "Url" -%}
{{ self.formatFieldName(field, isStrongLinkCaptured) -}}.absoluteString
{%- else -%}
{{ field.name }}
{%- endif -%}
{% endmacro %}
{% macro formatFieldName(field, isStrongLinkCaptured) %}
{%- import _self as self -%}
{%- if isStrongLinkCaptured -%}
{{ field.name }}
{%- else -%}
{{ self.formatNullableOrOptional(field.name, field.nullable, field.optional) -}}
{%- endif -%}
{% endmacro %}
{%- macro formatEncodingDate(field) -%}
{%- if field.type.dateFormats is not empty -%}
ApiDateFormattingService.string(from: {{ field.name -}}, format: .{{- dateFormatToName(field.type.dateFormats[0]) -}})
{%- else -%}
ApiDateFormattingService.string(from: {{ field.name -}}, format: .{{- dateFormatToName(field.type.dateFormat) -}})
{%- endif -%}
{%- endmacro -%}
{%- macro formatEncodingStringDecimal(field) -%}
ApiNumberFormattingService.string(from: {{ field.name -}}, format: .decimal)
{%- endmacro -%}
{% macro encodeIfPresent(field) %}
{%- import _self as self -%}
{%- set baseTypeName = field.type.type.baseTypeName -%}
{% if baseTypeName == "Date" or baseTypeName == "DateTime" or baseTypeName == "DateTimeTimestamp" or baseTypeName == "StringDecimal" %}
if let {{ field.name }} = {{ field.name }} {
try container.encode({{- self.formatEncodingValue(field, true) -}}, 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 -%}
{%- import 'complexField.utils.twig' as complexFieldUtils -%}
{%- set baseTypeName = field.type.type.baseTypeName -%}
{%- if baseTypeName == "Color" or baseTypeName == "Date" or baseTypeName == "DateTime" or baseTypeName == "StringDecimal" or baseTypeName == "Url" -%}
{{ complexFieldUtils.decodeComplexField(field, "String") -}}
{%- elseif baseTypeName == "DateTimeTimestamp" -%}
{{ complexFieldUtils.decodeComplexField(field, "Int") -}}
{%- elseif baseTypeName == "Decimal" -%}
{{ complexFieldUtils.decodeComplexField(field, "Decimal") -}}
{%- else -%}
self.{{ field.name }} = try container.{{- self.formatOptionalDecode(field) -}}({{ self.formatValueType(field.type.type) }}.self, forKey: .{{ field.name }})
{%- endif -%}
{% endmacro %}
{% macro formatOptionalDecode(field) %}
{%- if field.optional or field.nullable -%}
decodeIfPresent
{%- else -%}
decode
{%- endif -%}
{% endmacro %}
{% macro enumValueName(value) %}
{%- import _self as self -%}
{{- self.decapitalize(value.name) -}}
{%- endmacro %}
{% macro escapeIfNeeded(expr) %}
{%- if expr == "default" or expr == "operator" -%}
`{{ expr }}`
{%- else -%}
{{ expr }}
{%- endif -%}
{% 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 == "Date" or baseTypeName == "DateTime" or baseTypeName == "DateTimeTimestamp" -%}
Date().inDefaultRegion()
{%- elseif baseTypeName == "Double" -%}
0.0
{%- elseif baseTypeName == "Long" or baseTypeName == "Int" -%}
0
{%- elseif baseTypeName == "Bool" -%}
false
{%- elseif baseTypeName == "Decimal" or baseTypeName == "StringDecimal" -%}
.zero
{%- elseif baseTypeName == "Color" -%}
.clear
{%- elseif baseTypeName == "Url" -%}
URL(string: "https://example.com")!
{%- 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 %}