From 21df70b5be1e0eff9dd000edf219dc0fa6416a1e Mon Sep 17 00:00:00 2001 From: Honza Dvorsky Date: Mon, 16 May 2016 21:49:33 +0100 Subject: [PATCH 1/3] Adding JSON type --- Sources/JSON.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Sources/JSON.swift diff --git a/Sources/JSON.swift b/Sources/JSON.swift new file mode 100644 index 0000000..3a608b2 --- /dev/null +++ b/Sources/JSON.swift @@ -0,0 +1,15 @@ + +public enum JSON { + + public enum Number { + case integer(Int) + case double(Double) + } + + case object([String: JSON]) + case array([JSON]) + case number(JSON.Number) + case string(String) + case boolean(Bool) + case null +} From 952366a960e5a6b3a46f97b8aac23853d48bdb30 Mon Sep 17 00:00:00 2001 From: antonmes Date: Thu, 19 May 2016 00:31:58 +0300 Subject: [PATCH 2/3] Add unsignedInteger --- Sources/JSON.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Sources/JSON.swift b/Sources/JSON.swift index 3a608b2..c9498c4 100644 --- a/Sources/JSON.swift +++ b/Sources/JSON.swift @@ -1,11 +1,9 @@ - public enum JSON { - public enum Number { case integer(Int) + case unsignedInteger(UInt) case double(Double) } - case object([String: JSON]) case array([JSON]) case number(JSON.Number) From bad69ed399aa5a6864ca2c8b04f359de1854e514 Mon Sep 17 00:00:00 2001 From: antonmes Date: Thu, 19 May 2016 00:32:07 +0300 Subject: [PATCH 3/3] Add initializers --- Sources/JSON.swift | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Sources/JSON.swift b/Sources/JSON.swift index c9498c4..211a5ab 100644 --- a/Sources/JSON.swift +++ b/Sources/JSON.swift @@ -11,3 +11,40 @@ public enum JSON { case boolean(Bool) case null } + +// +// TODO: refactor with +// https://github.com/apple/swift-evolution/blob/master/proposals/0080-failable-numeric-initializers.md +// + +extension Int { + public init?(_ number: JSON.Number) { + switch number { + case let .integer(value) : self.init(value) + case let .unsignedInteger(value) where value <= UInt(Int.max) : self.init(value) + case let .double(value) where value <= Double(Int32.max): self.init(value) + default: return nil + } + } +} + +extension UInt { + public init?(_ number: JSON.Number) { + switch number { + case let .integer(value) where value > 0 : self.init(value) + case let .unsignedInteger(value) : self.init(value) + case let .double(value) where value <= Double(UInt32.max): self.init(value) + default: return nil + } + } +} + +extension Double { + public init(_ number: JSON.Number) { + switch number { + case let .integer(value) : self.init(value) + case let .unsignedInteger(value): self.init(value) + case let .double(value) : self.init(value) + } + } +}