From 9877d89c8ddf9e751c0db327b0c5bdd942e14e5d Mon Sep 17 00:00:00 2001 From: Mihael Isaev Date: Sun, 14 Oct 2018 04:36:15 +0400 Subject: [PATCH 1/6] Fix nested arrays parsing --- Sources/XMLParsing/XMLStackParser.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Sources/XMLParsing/XMLStackParser.swift b/Sources/XMLParsing/XMLStackParser.swift index 6aea4f6..ef44748 100644 --- a/Sources/XMLParsing/XMLStackParser.swift +++ b/Sources/XMLParsing/XMLStackParser.swift @@ -163,7 +163,15 @@ internal class _XMLElement { for childElement in children { for child in childElement.value { if let content = child.value { - node[childElement.key] = content + if var arr = node[childElement.key] as? [Any] { + arr.append(content) + node[childElement.key] = arr + } else if let v = node[childElement.key] { + let arr: [Any] = [v, content] + node[childElement.key] = arr + } else { + node[childElement.key] = content + } } else if !child.children.isEmpty || !child.attributes.isEmpty { let newValue = child.flatten() From d909c3f1bc5ef767557df85b5f3d0c32989df8a4 Mon Sep 17 00:00:00 2001 From: Mihael Isaev Date: Sun, 14 Oct 2018 11:53:55 +0400 Subject: [PATCH 2/6] Fix nested arrays parsing when only one element --- Sources/XMLParsing/XMLStackParser.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Sources/XMLParsing/XMLStackParser.swift b/Sources/XMLParsing/XMLStackParser.swift index ef44748..8f24761 100644 --- a/Sources/XMLParsing/XMLStackParser.swift +++ b/Sources/XMLParsing/XMLStackParser.swift @@ -170,7 +170,11 @@ internal class _XMLElement { let arr: [Any] = [v, content] node[childElement.key] = arr } else { - node[childElement.key] = content + if let type = node["type"] as? String, type == "array" { + node[childElement.key] = [content] + } else { + node[childElement.key] = content + } } } else if !child.children.isEmpty || !child.attributes.isEmpty { let newValue = child.flatten() From a4208097fba520874b545aed8fdb04f4db67f55b Mon Sep 17 00:00:00 2001 From: Mihael Isaev Date: Sun, 21 Oct 2018 07:50:17 +0400 Subject: [PATCH 3/6] Replace kCFBool with linux compatible alternative --- Sources/XMLParsing/Decoder/XMLDecoder.swift | 113 ++++++++------------ 1 file changed, 45 insertions(+), 68 deletions(-) diff --git a/Sources/XMLParsing/Decoder/XMLDecoder.swift b/Sources/XMLParsing/Decoder/XMLDecoder.swift index 78ee8e9..9fcc3c1 100644 --- a/Sources/XMLParsing/Decoder/XMLDecoder.swift +++ b/Sources/XMLParsing/Decoder/XMLDecoder.swift @@ -348,15 +348,13 @@ extension _XMLDecoder { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: string) } - let number = NSNumber(value: value) - - guard number !== kCFBooleanTrue, number !== kCFBooleanFalse else { + guard value != 1, value != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) } - let int = number.intValue - guard NSNumber(value: int) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(number)> does not fit in \(type).")) + let int = Int(value) + guard Float(int) == value else { + throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(value)> does not fit in \(type).")) } return int @@ -371,15 +369,13 @@ extension _XMLDecoder { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: string) } - let number = NSNumber(value: value) - - guard number !== kCFBooleanTrue, number !== kCFBooleanFalse else { + guard value != 1, value != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) } - let int8 = number.int8Value - guard NSNumber(value: int8) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(number)> does not fit in \(type).")) + let int8 = Int8(value) + guard Float(int8) == value else { + throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(value)> does not fit in \(type).")) } return int8 @@ -394,15 +390,13 @@ extension _XMLDecoder { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: string) } - let number = NSNumber(value: value) - - guard number !== kCFBooleanTrue, number !== kCFBooleanFalse else { + guard value != 1, value != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) } - let int16 = number.int16Value - guard NSNumber(value: int16) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(number)> does not fit in \(type).")) + let int16 = Int16(value) + guard Float(int16) == value else { + throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(value)> does not fit in \(type).")) } return int16 @@ -417,15 +411,13 @@ extension _XMLDecoder { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: string) } - let number = NSNumber(value: value) - - guard number !== kCFBooleanTrue, number !== kCFBooleanFalse else { + guard value != 1, value != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) } - let int32 = number.int32Value - guard NSNumber(value: int32) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(number)> does not fit in \(type).")) + let int32 = Int32(value) + guard Float(int32) == value else { + throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(value)> does not fit in \(type).")) } return int32 @@ -440,15 +432,13 @@ extension _XMLDecoder { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: string) } - let number = NSNumber(value: value) - - guard number !== kCFBooleanTrue, number !== kCFBooleanFalse else { + guard value != 1, value != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) } - let int64 = number.int64Value - guard NSNumber(value: int64) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(number)> does not fit in \(type).")) + let int64 = Int64(value) + guard Float(int64) == value else { + throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(value)> does not fit in \(type).")) } return int64 @@ -463,15 +453,13 @@ extension _XMLDecoder { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: string) } - let number = NSNumber(value: value) - - guard number !== kCFBooleanTrue, number !== kCFBooleanFalse else { + guard value != 1, value != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) } - let uint = number.uintValue - guard NSNumber(value: uint) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(number)> does not fit in \(type).")) + let uint = UInt(value) + guard Float(uint) == value else { + throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(value)> does not fit in \(type).")) } return uint @@ -486,15 +474,13 @@ extension _XMLDecoder { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: string) } - let number = NSNumber(value: value) - - guard number !== kCFBooleanTrue, number !== kCFBooleanFalse else { + guard value != 1, value != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) } - let uint8 = number.uint8Value - guard NSNumber(value: uint8) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(number)> does not fit in \(type).")) + let uint8 = UInt8(value) + guard Float(uint8) == value else { + throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(value)> does not fit in \(type).")) } return uint8 @@ -509,15 +495,13 @@ extension _XMLDecoder { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: string) } - let number = NSNumber(value: value) - - guard number !== kCFBooleanTrue, number !== kCFBooleanFalse else { + guard value != 1, value != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) } - let uint16 = number.uint16Value - guard NSNumber(value: uint16) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(number)> does not fit in \(type).")) + let uint16 = UInt16(value) + guard Float(uint16) == value else { + throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(value)> does not fit in \(type).")) } return uint16 @@ -532,15 +516,13 @@ extension _XMLDecoder { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: string) } - let number = NSNumber(value: value) - - guard number !== kCFBooleanTrue, number !== kCFBooleanFalse else { + guard value != 1, value != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) } - let uint32 = number.uint32Value - guard NSNumber(value: uint32) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(number)> does not fit in \(type).")) + let uint32 = UInt32(value) + guard Float(uint32) == value else { + throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(value)> does not fit in \(type).")) } return uint32 @@ -555,15 +537,13 @@ extension _XMLDecoder { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: string) } - let number = NSNumber(value: value) - - guard number !== kCFBooleanTrue, number !== kCFBooleanFalse else { + guard value != 1, value != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) } - let uint64 = number.uint64Value - guard NSNumber(value: uint64) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(number)> does not fit in \(type).")) + let uint64 = UInt64(value) + guard Float(uint64) == value else { + throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number <\(value)> does not fit in \(type).")) } return uint64 @@ -575,18 +555,15 @@ extension _XMLDecoder { guard let string = value as? String else { return nil } if let value = Double(string) { - let number = NSNumber(value: value) - - guard number !== kCFBooleanTrue, number !== kCFBooleanFalse else { + guard value != 1, value != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) } - let double = number.doubleValue - guard abs(double) <= Double(Float.greatestFiniteMagnitude) else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number \(number) does not fit in \(type).")) + guard abs(value) <= Double(Float.greatestFiniteMagnitude) else { + throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed XML number \(value) does not fit in \(type).")) } - return Float(double) + return Float(value) } else if case let .convertFromString(posInfString, negInfString, nanString) = self.options.nonConformingFloatDecodingStrategy { if string == posInfString { return Float.infinity @@ -607,7 +584,7 @@ extension _XMLDecoder { if let number = Decimal(string: string) as NSDecimalNumber? { - guard number !== kCFBooleanTrue, number !== kCFBooleanFalse else { + guard number != 1, number != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) } From ffac5ac0585bb360d93291a5deb9c911a655c5e2 Mon Sep 17 00:00:00 2001 From: Mihael Isaev Date: Sun, 21 Oct 2018 07:53:58 +0400 Subject: [PATCH 4/6] Trying to fix NSDecimalNumber --- Sources/XMLParsing/Decoder/XMLDecoder.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/XMLParsing/Decoder/XMLDecoder.swift b/Sources/XMLParsing/Decoder/XMLDecoder.swift index 9fcc3c1..53317f6 100644 --- a/Sources/XMLParsing/Decoder/XMLDecoder.swift +++ b/Sources/XMLParsing/Decoder/XMLDecoder.swift @@ -582,7 +582,7 @@ extension _XMLDecoder { guard let string = value as? String else { return nil } - if let number = Decimal(string: string) as NSDecimalNumber? { + if let number = NSDecimalNumber(string: string) { guard number != 1, number != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) From c928c2e45ae6d49fdbf25c00b19443acdb71c2cd Mon Sep 17 00:00:00 2001 From: Mihael Isaev Date: Sun, 21 Oct 2018 07:56:27 +0400 Subject: [PATCH 5/6] Fixing NSDecimalNumber --- Sources/XMLParsing/Decoder/XMLDecoder.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sources/XMLParsing/Decoder/XMLDecoder.swift b/Sources/XMLParsing/Decoder/XMLDecoder.swift index 53317f6..a00ff51 100644 --- a/Sources/XMLParsing/Decoder/XMLDecoder.swift +++ b/Sources/XMLParsing/Decoder/XMLDecoder.swift @@ -582,7 +582,8 @@ extension _XMLDecoder { guard let string = value as? String else { return nil } - if let number = NSDecimalNumber(string: string) { + if let _ = Decimal(string: string) { + let number = NSDecimalNumber(string: string) guard number != 1, number != 0 else { throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) From 8853c2c4b6332095d1f5b1db6a4a9b99431cc233 Mon Sep 17 00:00:00 2001 From: iMike Date: Fri, 25 Oct 2019 00:35:43 +0400 Subject: [PATCH 6/6] Update Package.swift --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 3005e47..f17245a 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:4.0 +// swift-tools-version:4.2 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription