Skip to content

Commit

Permalink
Merge pull request #38 from open-swift/hd/json
Browse files Browse the repository at this point in the history
RFC 7159 JSON Using Internal Number
  • Loading branch information
tanner0101 committed May 24, 2016
2 parents dff733a + bad69ed commit 275d812
Showing 1 changed file with 50 additions and 0 deletions.
50 changes: 50 additions & 0 deletions Sources/JSON.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
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)
case string(String)
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)
}
}
}

0 comments on commit 275d812

Please # to comment.