From d883cdd4312de2eca1a567bd71c6c9ab4c1e2426 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Tue, 17 Apr 2018 19:55:06 +0300 Subject: [PATCH 1/5] swift templates fixes --- Swift/macroses/class.utils.twig | 2 +- Swift/macroses/common.utils.twig | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Swift/macroses/class.utils.twig b/Swift/macroses/class.utils.twig index 91c81cb..ac14d4e 100644 --- a/Swift/macroses/class.utils.twig +++ b/Swift/macroses/class.utils.twig @@ -4,7 +4,7 @@ {%- if parameters is not empty -%} < {%- for typeParameter in parameters %} - {{- utils.formatValueType(typeParameter) -}}{{- withConstraint ? ": ImmutableMappable" : ""-}}{%- if not (loop.last) %}, {% endif %} + {{- utils.formatValueType(typeParameter) -}}{{- withConstraint ? ": UniversalMappable" : ""-}}{%- if not (loop.last) %}, {% endif %} {%- endfor -%} > {%- endif -%} diff --git a/Swift/macroses/common.utils.twig b/Swift/macroses/common.utils.twig index cd55fd8..7eebe8f 100644 --- a/Swift/macroses/common.utils.twig +++ b/Swift/macroses/common.utils.twig @@ -106,7 +106,7 @@ {%- elseif (valueType.parent is not null) -%} {%- import _self as self -%} - {{ self.valueTypeHasGenerics(valueType.parent) }} + {{- self.valueTypeHasGenerics(valueType.parent) -}} {%- endif -%} {% endmacro %} @@ -121,13 +121,13 @@ {%- if (valueType.itemsType.typeParameters is not null) -%} {{ true }} {%- else -%} - {{ self.hasGenericsOrNonEqutableCollections(valueType.itemsType) }} + {{- 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) }} + {{- self.hasGenericsOrNonEqutableCollections(field.type) -}} {%- endfor -%} {%- endif -%} {%- endmacro %} From d686c41cab903883d0776d27cc0fd602fcf36657 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Tue, 17 Apr 2018 20:27:56 +0300 Subject: [PATCH 2/5] 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 %} From b6fd40f30ffa4a5a069f6d5ca268d0523939171f Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Tue, 17 Apr 2018 20:48:14 +0300 Subject: [PATCH 3/5] UniversalMappable conformance --- Swift/Class.swift.twig | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Swift/Class.swift.twig b/Swift/Class.swift.twig index a7a1afd..ed9549b 100644 --- a/Swift/Class.swift.twig +++ b/Swift/Class.swift.twig @@ -60,7 +60,20 @@ import LeadKit } -{% if (not hasChilds) and (not hasGenerics) and (not fieldsHasGenericsOrNonEqutableCollections) -%} +{% if not hasChilds %} + +extension {{ type.baseTypeName }}: UniversalMappable { + + static func decode(from map: Map, key: String) throws -> {{ type.baseTypeName }} { + return try map.value(key) + } + +} + +{{ "\n" }} +{%- endif -%} + +{%- if (not hasChilds) and (not hasGenerics) and (not fieldsHasGenericsOrNonEqutableCollections) -%} extension {{ type.baseTypeName }}: Equatable { static func ==(lhs: {{ classType }}, rhs: {{ classType }}) -> Bool { From 1e0a2f4defc6c041dc442e37a5c6e0a854bd1939 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Tue, 17 Apr 2018 20:48:58 +0300 Subject: [PATCH 4/5] remove spaces --- Swift/Class.swift.twig | 2 -- 1 file changed, 2 deletions(-) diff --git a/Swift/Class.swift.twig b/Swift/Class.swift.twig index ed9549b..b4ab2a7 100644 --- a/Swift/Class.swift.twig +++ b/Swift/Class.swift.twig @@ -61,7 +61,6 @@ import LeadKit } {% if not hasChilds %} - extension {{ type.baseTypeName }}: UniversalMappable { static func decode(from map: Map, key: String) throws -> {{ type.baseTypeName }} { @@ -69,7 +68,6 @@ extension {{ type.baseTypeName }}: UniversalMappable { } } - {{ "\n" }} {%- endif -%} From 41bf4931ca5efe345b97f1ef6a1ddd5da7b32f04 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Wed, 18 Apr 2018 12:20:11 +0300 Subject: [PATCH 5/5] nullable optional universal mappable --- Swift/Class.swift.twig | 7 +++---- Swift/macroses/common.utils.twig | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Swift/Class.swift.twig b/Swift/Class.swift.twig index b4ab2a7..1082178 100644 --- a/Swift/Class.swift.twig +++ b/Swift/Class.swift.twig @@ -55,12 +55,11 @@ import LeadKit } return{%- if hasParent %} super.isEqual(to: other){%- endif %}{%- if (fields is not empty) and hasParent %} &&{% endif %} {% include 'blocks/class/fields-equal.twig' with { fields: fields } %} - } + }{{ "\n" }} {%- endif %} - } - -{% if not hasChilds %} +{{ "\n" }} +{%- if not hasChilds -%} extension {{ type.baseTypeName }}: UniversalMappable { static func decode(from map: Map, key: String) throws -> {{ type.baseTypeName }} { diff --git a/Swift/macroses/common.utils.twig b/Swift/macroses/common.utils.twig index 9322d43..6f27a7f 100644 --- a/Swift/macroses/common.utils.twig +++ b/Swift/macroses/common.utils.twig @@ -56,7 +56,7 @@ {%- if field.type.type.baseTypeName == "DateTime" -%} {{ field.name }} >>> (map["{{ field.jsonName }}"], {{ self.mappingTransformForField(field) -}}) {%- elseif (self.fieldIsGeneric(field, typeParameters) != null) -%} - {{ field.name }}.encode(to: map, key: "{{ field.jsonName }}") + {{ self.formatNullableOrOptional(field.name, field.nullable, field.optional) }}.encode(to: map, key: "{{ field.jsonName }}") {%- else -%} {{ field.name }} >>> map["{{ field.jsonName }}"] {%- endif -%}