Advertisement
Guest User

Untitled

a guest
Aug 4th, 2015
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.27 KB | None | 0 0
  1. //
  2. // Alter.swift
  3. // Alter
  4. //
  5. // Created by Wesley Cope on 7/16/15.
  6. // Copyright © 2015 Wess Cope. All rights reserved.
  7. //
  8.  
  9.  
  10. /* USAGE:
  11.  
  12.  
  13. struct User {
  14. let name:String
  15. let email:String
  16. let nickname:String?
  17. }
  18.  
  19. extension User:Alter {
  20. static func map(json: AnyObject) -> User {
  21. return try {
  22. name: json >> "name",
  23. email: json >> "email",
  24. nickname: json >> "nickname"
  25. }
  26. }
  27. }
  28.  
  29. */
  30.  
  31. import Foundation
  32.  
  33. enum AlterError: ErrorType {
  34. case MissingKeyError(String, Any)
  35. case MismatchTypeError(String, Any)
  36. case InvalidJSONObject(AnyObject)
  37. }
  38.  
  39. protocol Alter {
  40. static func map(node: AnyObject) throws -> Self
  41. }
  42.  
  43. extension String: Alter {
  44. static func map(node: AnyObject) throws -> String {
  45. guard let result = node as? String else {
  46. throw AlterError.MismatchTypeError("String", node)
  47. }
  48.  
  49. return result
  50. }
  51. }
  52.  
  53.  
  54. extension Int: Alter {
  55. static func map(node: AnyObject) throws -> Int {
  56. guard let result = node as? Int else {
  57. throw AlterError.MismatchTypeError("Int", node)
  58. }
  59.  
  60. return result
  61. }
  62. }
  63.  
  64. extension Double: Alter {
  65. static func map(node: AnyObject) throws -> Double {
  66. guard let result = node as? Double else {
  67. throw AlterError.MismatchTypeError("Double", node)
  68. }
  69.  
  70. return result
  71. }
  72. }
  73.  
  74. infix operator >> {
  75. associativity left precedence 150
  76. }
  77.  
  78. infix operator >>? {
  79. associativity left precedence 150
  80. }
  81.  
  82. func >> <T:Alter>(left: AnyObject, right: String) throws -> T {
  83. guard let dict = left as? [String: AnyObject] else {
  84. throw AlterError.InvalidJSONObject(left)
  85. }
  86.  
  87. guard let object = dict[right] else {
  88. throw AlterError.MissingKeyError(right, dict)
  89. }
  90.  
  91. return try T.map(object)
  92. }
  93.  
  94. func >> (left: AnyObject, right: String) throws -> [String: AnyObject] {
  95. guard let dict = left as? [String: AnyObject] else {
  96. throw AlterError.InvalidJSONObject(left)
  97. }
  98.  
  99. guard let object = dict[right] else {
  100. throw AlterError.MissingKeyError(right, dict)
  101. }
  102.  
  103. guard let result = object as? [String: AnyObject] else {
  104. throw AlterError.MismatchTypeError("Valid JSON Object", object)
  105. }
  106.  
  107. return result
  108. }
  109.  
  110. func >> <T:Alter>(left: AnyObject, right: String) -> T? {
  111. do {
  112. let result:T = try left >> right
  113.  
  114. return result
  115. }
  116. catch {
  117. return nil
  118. }
  119. }
  120.  
  121. func >>? <T:Alter>(left: AnyObject, right: String) throws -> [T] {
  122. guard let dict = left as? [String: AnyObject] else {
  123. throw AlterError.InvalidJSONObject(left)
  124. }
  125.  
  126. guard let list = dict[right] as? [AnyObject] else {
  127. throw AlterError.MismatchTypeError("Array", left)
  128. }
  129.  
  130. var result = [T]()
  131.  
  132. for node in list {
  133. do {
  134. try result.append(T.map(node))
  135. }
  136. catch let AlterError.MismatchTypeError(key, val) {
  137. print("Optional: Type mismatch - \(key): \(val)")
  138. }
  139. catch let AlterError.InvalidJSONObject(obj) {
  140. print("Optional: Invalid object - \(obj)")
  141. }
  142. catch let AlterError.MissingKeyError(key, val) {
  143. print("Optional: Missing key - \(key): \(val)")
  144. }
  145. }
  146.  
  147. return result
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement