From d686c41cab903883d0776d27cc0fd602fcf36657 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Tue, 17 Apr 2018 20:27:56 +0300 Subject: [PATCH] Universal mappable --- Swift/Class.swift.twig | 6 ++++-- .../blocks/class/fields-mapping-from-map.twig | 2 +- Swift/blocks/class/fields-mapping-to-map.twig | 4 ++-- Swift/macroses/common.utils.twig | 20 +++++++++++++++---- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Swift/Class.swift.twig b/Swift/Class.swift.twig index 01f4723..a7a1afd 100644 --- a/Swift/Class.swift.twig +++ b/Swift/Class.swift.twig @@ -29,7 +29,8 @@ import LeadKit required init(map: Map) throws { {%- include 'blocks/class/fields-mapping-from-map.twig' with { fields: fields, - classType: classType + classType: classType, + typeParameters: type.typeParameters } -%} {% if hasParent %} try super.init(map: map) @@ -39,7 +40,8 @@ import LeadKit {% if hasParent %} override {% endif %}func mapping(map: Map) { {%- include 'blocks/class/fields-mapping-to-map.twig' with { fields: fields, - classType: classType + classType: classType, + typeParameters: type.typeParameters } -%} {% if hasParent %} super.mapping(map: map) diff --git a/Swift/blocks/class/fields-mapping-from-map.twig b/Swift/blocks/class/fields-mapping-from-map.twig index 6b2b9dd..4289fbd 100644 --- a/Swift/blocks/class/fields-mapping-from-map.twig +++ b/Swift/blocks/class/fields-mapping-from-map.twig @@ -1,4 +1,4 @@ {%- import '../../macroses/common.utils.twig' as utils -%} {%- for field in fields %} - {{ field.name }} = {{ utils.formatNullableOrOptional('try', field.nullable, field.optional) }} {{ utils.mappingFromMapForField(field, classType) }} + {{ field.name }} = {{ utils.formatNullableOrOptional('try', field.nullable, field.optional) }} {{ utils.mappingFromMapForField(field, classType, typeParameters) }} {%- endfor -%} \ No newline at end of file diff --git a/Swift/blocks/class/fields-mapping-to-map.twig b/Swift/blocks/class/fields-mapping-to-map.twig index 253edae..7a85af4 100644 --- a/Swift/blocks/class/fields-mapping-to-map.twig +++ b/Swift/blocks/class/fields-mapping-to-map.twig @@ -2,9 +2,9 @@ {%- for field in fields %} {%- if field.optional %} if {{ field.name }} != nil { - {{ field.name }} >>> {{ utils.mappingToMapForField(field, classType) }} + {{ utils.mappingToMapForField(field, classType, typeParameters) }} } {%- else %} - {{ field.name }} >>> {{ utils.mappingToMapForField(field, classType) }} + {{ utils.mappingToMapForField(field, classType, typeParameters) }} {%- endif -%} {%- endfor -%} \ No newline at end of file diff --git a/Swift/macroses/common.utils.twig b/Swift/macroses/common.utils.twig index 7eebe8f..9322d43 100644 --- a/Swift/macroses/common.utils.twig +++ b/Swift/macroses/common.utils.twig @@ -36,25 +36,29 @@ {%- endif -%} {% endmacro %} -{% macro mappingFromMapForField(field, className) %} +{% macro mappingFromMapForField(field, className, typeParameters) %} {%- import _self as self -%} {%- if field.type.type.baseTypeName == "DateTime" -%} map.value("{{ field.jsonName }}", using: {{ self.mappingTransformForField(field) -}}) {%- elseif field.type.type.baseTypeName == "Decimal" -%} map.value("{{ field.jsonName }}", using: NSDecimalNumberTransform()) + {%- elseif (self.fieldIsGeneric(field, typeParameters) != null) -%} + {{ field.type.type.baseTypeName }}.decode(from: map, key: "{{ field.jsonName }}") {%- else -%} map.value("{{ field.jsonName }}") {%- endif -%} {% endmacro %} -{% macro mappingToMapForField(field, className) %} +{% macro mappingToMapForField(field, className, typeParameters) %} {%- import _self as self -%} {%- if field.type.type.baseTypeName == "DateTime" -%} - (map["{{ field.jsonName }}"], {{ self.mappingTransformForField(field) -}}) + {{ field.name }} >>> (map["{{ field.jsonName }}"], {{ self.mappingTransformForField(field) -}}) + {%- elseif (self.fieldIsGeneric(field, typeParameters) != null) -%} + {{ field.name }}.encode(to: map, key: "{{ field.jsonName }}") {%- else -%} - map["{{ field.jsonName }}"] + {{ field.name }} >>> map["{{ field.jsonName }}"] {%- endif -%} {% endmacro %} @@ -131,3 +135,11 @@ {%- endfor -%} {%- endif -%} {%- endmacro %} + +{% macro fieldIsGeneric(field, typeParameters) %} + {%- for typeParameter in typeParameters -%} + {%- if typeParameter.baseTypeName == field.type.type.baseTypeName -%} + {{ true }} + {%- endif -%} + {%- endfor -%} +{% endmacro %}