diff --git a/Swift/ApiNumberFormattingService.swift.twig b/Swift/ApiNumberFormattingService.swift.twig index c6c03c2..c74c37c 100644 --- a/Swift/ApiNumberFormattingService.swift.twig +++ b/Swift/ApiNumberFormattingService.swift.twig @@ -1,29 +1,43 @@ {%- import 'macroses/common.utils.twig' as utils -%} +import LeadKit import Foundation -final class ApiNumberFormattingService { +enum ApiNumberFormat: NumberFormat { - static let shared = ApiNumberFormattingService() + case decimal + + var numberFormatter: NumberFormatter { + let numberFormatter = NumberFormatter() + + switch self { + case .decimal: + let numberFormatter = NumberFormatter() + numberFormatter.decimalSeparator = "." + numberFormatter.minimumIntegerDigits = 1 + numberFormatter.maximumFractionDigits = 16 + } + + return numberFormatter + } +} + +final class ApiNumberFormattingService: NumberFormattingService, Singleton { + + typealias NumberFormatType = ApiNumberFormat - func decimalNumber(from string: String) -> NSDecimalNumber? { - guard let number = numberFormatter.number(from: string) else { + let formatters = computedFormatters + + static let shared = ApiNumebrFormattingService() + + private init() {} + + func decimalNumber(from string: String, format: ApiNumberFormat) -> NSDecimalNumber? { + guard let number = number(from: string, format: format) else { return nil } return NSDecimalNumber(decimal: number.decimalValue) } - - func string(from number: NSDecimalNumber) -> String { - return number.stringValue - } - - private init() {} - - private lazy var numberFormatter: NumberFormatter = { - let formatter = NumberFormatter() - formatter.decimalSeparator = "." - return formatter - }() } {{ "\n" }} \ No newline at end of file diff --git a/Swift/blocks/class/copy-declaration.twig b/Swift/blocks/class/copy-declaration.twig index 2e759cc..d05d1b4 100644 --- a/Swift/blocks/class/copy-declaration.twig +++ b/Swift/blocks/class/copy-declaration.twig @@ -4,7 +4,6 @@ return {{ type.baseTypeName }}({% include '../class/fields-optional-initialization.twig' with { fields: allFieldsOrdered } %}) } -{%- set containsOptionalFields = false -%} {%- if allFieldsOrdered is not empty -%} {%- for field in allFieldsOrdered -%} {%- if field.nullable or field.optional -%} diff --git a/Swift/macroses/common.utils.twig b/Swift/macroses/common.utils.twig index 72d0c52..0024d73 100644 --- a/Swift/macroses/common.utils.twig +++ b/Swift/macroses/common.utils.twig @@ -46,7 +46,7 @@ {%- elseif field.type.type.baseTypeName == "Url" -%} {{ self.formatStrongOrNullableOptional(field, strong) -}}.absoluteString {%- elseif field.type.type.baseTypeName == "StringDecimal" -%} - ApiNumberFormattingService.shared.string(from: {{ field.name -}}) + {{- self.formatEncodingStringDecimal(field) -}} {%- else -%} {{ field.name }} {%- endif -%} @@ -66,6 +66,10 @@ ApiDateFormattingService.string(from: {{ field.name -}}, format: .{{- dateFormatToName(field.type.dateFormat) -}}) {%- endmacro -%} +{%- macro formatEncodingStringDecimal(field) -%} + ApiNumberFormattingService.shared.string(from: {{ field.name -}}, format: .decimal) +{%- endmacro -%} + {% macro escapeIfNeeded(expr) %} {%- if expr == "default" or expr == "operator" -%} `{{ expr }}` @@ -84,8 +88,7 @@ {%- set intInit = "Int(%s.timeIntervalSince1970)"|format(field.name) -%} {{ complexFieldUtils.encodeComplexFieldIfPresent(field, intInit) -}} {%- elseif field.type.type.baseTypeName == "StringDecimal" -%} - {%- set stringDecimalInit = "ApiNumberFormattingService.shared.string(from: %s)"|format(field.name) -%} - {{ complexFieldUtils.encodeComplexFieldIfPresent(field, stringDecimalInit) -}} + {{ complexFieldUtils.encodeComplexFieldIfPresent(field, self.formatEncodingStringDecimal(field)) -}} {%- else -%} try container.encodeIfPresent({{- self.formatEncodingValue(field, false) -}}, forKey: .{{- field.name -}}) {%- endif -%} diff --git a/Swift/macroses/complexField.utils.twig b/Swift/macroses/complexField.utils.twig index a01d846..d1bf02a 100644 --- a/Swift/macroses/complexField.utils.twig +++ b/Swift/macroses/complexField.utils.twig @@ -24,7 +24,7 @@ {%- set urlInit = "URL(string: %s)"|format(field.name) -%} {{ self.decodeThrowableField(field, urlInit, 'Unable to decode URL from string') -}} {%- elseif field.type.type.baseTypeName == "StringDecimal" -%} - {%- set stringDecimalInit = "ApiNumberFormattingService.shared.decimalNumber(from: %s)"|format(field.name) -%} + {%- set stringDecimalInit = "ApiNumberFormattingService.shared.decimalNumber(from: %s, format: .decimal)"|format(field.name) -%} {{- self.decodeThrowableField(field, stringDecimalInit, 'Unable to decode decimal from string') -}} {%- elseif field.type.type.baseTypeName == "DateTimeTimestamp" -%} self.{{ field.name }} = DateInRegion(seconds: TimeInterval({{ field.name }}))