/src/main/scala/org/scalafoursquare/response/APICustomSerializers.scala

https://github.com/robsc/scala-foursquare-toy · Scala · 201 lines · 185 code · 16 blank · 0 comment · 18 complexity · 0db99616d448e99792f933d396d16ec5 MD5 · raw file

  1. package org.scalafoursquare.response
  2. import net.liftweb.json.{Extraction, DefaultFormats, TypeInfo, Formats, Serializer}
  3. import net.liftweb.json.JsonAST.{JBool, JString, JDouble, JInt, JArray, JField, JObject, JValue, JNothing, JNull}
  4. object APICustomSerializers {
  5. object Formats extends DefaultFormats
  6. def formats = Formats + UserSearchUnmatchedSerializer + PrimitiveSerializer + BadgesSerializer +
  7. VenueDetailSerializer + UpdateTargetSerializer + NotificationItemSerializer + SpecialConfigDetailSerializer
  8. def serializePrimitive(p: Primitive): JValue = {
  9. p match {
  10. case IntPrimitive(v) => JInt(v)
  11. case DoublePrimitive(v) => JDouble(v)
  12. case StringPrimitive(v) => JString(v)
  13. case BooleanPrimitive(v) => JBool(v)
  14. case NullPrimitive => JNull
  15. case _ => JNothing
  16. }
  17. }
  18. def deserializePrimitive(v: JValue): Primitive = {
  19. v match {
  20. case JInt(x) => IntPrimitive(x.intValue)
  21. case JDouble(x) => DoublePrimitive(x)
  22. case JString(x) => StringPrimitive(x)
  23. case JBool(x) => BooleanPrimitive(x)
  24. case JNull => NullPrimitive
  25. case _ => NothingPrimitive
  26. }
  27. }
  28. val PrimitiveSerializer = new Serializer[Primitive] {
  29. def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
  30. case x: Primitive => {serializePrimitive(x)}
  31. }
  32. val theClass = classOf[Primitive]
  33. def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), Primitive] = {
  34. case (TypeInfo(cls, _), v) if cls == theClass => deserializePrimitive(v)
  35. }
  36. }
  37. def serializeUpdateTarget(t: UpdateTarget)(implicit format: Formats): JValue = {
  38. def tf(ty: String) = JField("type", JString(ty))
  39. def ob(ov: JValue) = List(JField("object", ov))
  40. t match {
  41. case UserUpdateTarget(v) => JObject(tf("user") :: ob(Extraction.decompose(v)))
  42. case CheckinUpdateTarget(v) => JObject(tf("checkin") :: ob(Extraction.decompose(v)))
  43. case VenueUpdateTarget(v) => JObject(tf("venue") :: ob(Extraction.decompose(v)))
  44. case ListUpdateTarget(v) => JObject(tf("list") :: ob(Extraction.decompose(v)))
  45. case TipUpdateTarget(v) => JObject(tf("tip") :: ob(Extraction.decompose(v)))
  46. case BadgeUpdateTarget(v) => JObject(tf("badge") :: ob(Extraction.decompose(v)))
  47. case SpecialUpdateTarget(v) => JObject(tf("special") :: ob(Extraction.decompose(v)))
  48. case UrlUpdateTarget(v) => JObject(tf("url") :: ob(Extraction.decompose(v)))
  49. case _ => JNothing
  50. }
  51. }
  52. def deserializeUpdateTarget(obj: JObject)(implicit format: Formats): UpdateTarget = {
  53. val t = obj.obj.find(_.name == "type").map(_.value)
  54. val v = obj.obj.find(_.name == "object").map(_.value)
  55. (t,v) match {
  56. case (Some(JString("user")), Some(obj: JObject)) => UserUpdateTarget(obj.extract[UserCompact])
  57. case (Some(JString("checkin")), Some(obj: JObject)) => CheckinUpdateTarget(obj.extract[CheckinForFeed])
  58. case (Some(JString("venue")), Some(obj: JObject)) => VenueUpdateTarget(obj.extract[VenueCompact])
  59. case (Some(JString("list")), Some(obj: JObject)) => ListUpdateTarget(obj.extract[ListForList])
  60. case (Some(JString("tip")), Some(obj: JObject)) => TipUpdateTarget(obj.extract[TipForList])
  61. case (Some(JString("badge")), Some(obj: JObject)) => BadgeUpdateTarget(obj.extract[Badge])
  62. case (Some(JString("special")), Some(obj: JObject)) => SpecialUpdateTarget(obj.extract[Special])
  63. case (Some(JString("url")), Some(obj: JObject)) => UrlUpdateTarget(obj.extract[Url])
  64. case _ => NothingUpdateTarget
  65. }
  66. }
  67. val UpdateTargetSerializer = new Serializer[UpdateTarget] {
  68. def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
  69. case x: UpdateTarget => {serializeUpdateTarget(x)}
  70. }
  71. val theClass = classOf[UpdateTarget]
  72. def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), UpdateTarget] = {
  73. case (TypeInfo(cls, _), obj: JObject) if cls == theClass => deserializeUpdateTarget(obj)
  74. }
  75. }
  76. def serializeNotificationItem(t: NotificationItem)(implicit format: Formats): JValue = {
  77. def tf(ty: String) = JField("type", JString(ty))
  78. def ob(ov: JValue) = List(JField("item", ov))
  79. t match {
  80. case BadgeNotification(v) => JObject(tf("badge") :: ob(Extraction.decompose(v)))
  81. case TipNotification(v) => JObject(tf("tip") :: ob(Extraction.decompose(v)))
  82. case TipAlertNotification(v) => JObject(tf("tipAlert") :: ob(Extraction.decompose(v)))
  83. case LeaderboardNotification(v) => JObject(tf("leaderboard") :: ob(Extraction.decompose(v)))
  84. case MayorshipNotification(v) => JObject(tf("mayorship") :: ob(Extraction.decompose(v)))
  85. case SpecialsNotification(v) => JObject(tf("specials") :: ob(Extraction.decompose(v)))
  86. case MessageNotification(v) => JObject(tf("message") :: ob(Extraction.decompose(v)))
  87. case ScoreNotification(v) => JObject(tf("score") :: ob(Extraction.decompose(v)))
  88. case NotificationTrayNotification(v) => JObject(tf("notificationTray") :: ob(Extraction.decompose(v)))
  89. case _ => JNothing
  90. }
  91. }
  92. def deserializeNotificationItem(obj: JObject)(implicit format: Formats): NotificationItem = {
  93. val t = obj.obj.find(_.name == "type").map(_.value)
  94. val v = obj.obj.find(_.name == "item").map(_.value)
  95. (t,v) match {
  96. case (Some(JString("badge")), Some(obj: JObject)) => BadgeNotification(obj.extract[BadgeNotificationContent])
  97. case (Some(JString("tip")), Some(obj: JObject)) => TipNotification(obj.extract[TipNotificationContent])
  98. case (Some(JString("tipAlert")), Some(obj: JObject)) => TipAlertNotification(obj.extract[TipAlertNotificationContent])
  99. case (Some(JString("leaderboard")), Some(obj: JObject)) => LeaderboardNotification(obj.extract[LeaderboardNotificationContent])
  100. case (Some(JString("mayorship")), Some(obj: JObject)) => MayorshipNotification(obj.extract[MayorshipNotificationContent])
  101. case (Some(JString("specials")), Some(obj: JObject)) => SpecialsNotification(obj.extract[SpecialNotificationContent])
  102. case (Some(JString("message")), Some(obj: JObject)) => MessageNotification(obj.extract[MessageNotificationContent])
  103. case (Some(JString("score")), Some(obj: JObject)) => ScoreNotification(obj.extract[ScoreNotificationContent])
  104. case (Some(JString("notificationTray")), Some(obj: JObject)) => NotificationTrayNotification(obj.extract[NotificationTrayNotificationContent])
  105. case _ => NothingNotificationItem
  106. }
  107. }
  108. val NotificationItemSerializer = new Serializer[NotificationItem] {
  109. def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
  110. case x: NotificationItem => {serializeNotificationItem(x)}
  111. }
  112. val theClass = classOf[NotificationItem]
  113. def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), NotificationItem] = {
  114. case (TypeInfo(cls, _), obj: JObject) if cls == theClass => deserializeNotificationItem(obj)
  115. }
  116. }
  117. val UserSearchUnmatchedSerializer = new Serializer[UserSearchUnmatched] {
  118. def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
  119. case x: UserSearchUnmatched => {
  120. JObject(x.map.map(p=>{
  121. val key = p._1
  122. val vals = p._2
  123. JField(key, JArray(vals.map(v=>serializePrimitive(v))))
  124. }).toList)
  125. }
  126. }
  127. val theClass = classOf[UserSearchUnmatched]
  128. def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), UserSearchUnmatched] = {
  129. case (TypeInfo(cls, _), obj: JObject) if cls == theClass => {
  130. val map = obj.obj.map(f=>{
  131. val list = f.value match {case JArray(vs)=>vs.map(v=>deserializePrimitive(v)); case _ => Nil}
  132. (f.name, list)
  133. }).toMap
  134. new UserSearchUnmatched(map)
  135. }
  136. }
  137. }
  138. val BadgesSerializer = new Serializer[Badges] {
  139. def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
  140. case x: Badges => {
  141. JObject(x.map.map(p=>{
  142. JField(p._1, Extraction.decompose(p._2))
  143. }).toList)
  144. }
  145. }
  146. val theClass = classOf[Badges]
  147. def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), Badges] = {
  148. case (TypeInfo(cls, _), obj: JObject) if cls == theClass => {
  149. val map = obj.obj.map(f=>{
  150. (f.name, f.value.extract[Badge])
  151. }).toMap
  152. new Badges(map)
  153. }
  154. }
  155. }
  156. val VenueDetailSerializer = new Serializer[VenueDetail] {
  157. def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
  158. case x: VenueDetail => {
  159. JObject(Extraction.decompose(x.core).asInstanceOf[JObject].obj ++
  160. Extraction.decompose(x.extended).asInstanceOf[JObject].obj)
  161. }
  162. }
  163. val theClass = classOf[VenueDetail]
  164. def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), VenueDetail] = {
  165. case (TypeInfo(cls, _), obj: JObject) if cls == theClass => {
  166. VenueDetail(core = obj.extract[VenueCore], extended = obj.extract[VenueDetailExtended])
  167. }
  168. }
  169. }
  170. val SpecialConfigDetailSerializer = new Serializer[SpecialConfigurationDetail] {
  171. def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
  172. case x: SpecialConfigurationDetail => {
  173. JObject(Extraction.decompose(x.detail1).asInstanceOf[JObject].obj ++
  174. Extraction.decompose(x.detail2).asInstanceOf[JObject].obj)
  175. }
  176. }
  177. val theClass = classOf[SpecialConfigurationDetail]
  178. def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), SpecialConfigurationDetail] = {
  179. case (TypeInfo(cls, _), obj: JObject) if cls == theClass => {
  180. SpecialConfigurationDetail(detail1 = obj.extract[SpecialConfigurationDetail1],
  181. detail2 = obj.extract[SpecialConfigurationDetail2])
  182. }
  183. }
  184. }
  185. }