Как использовать ReactiveMongo с перечислением?

Я работаю с Play Framework и ReactiveMongo. Я пытаюсь написать программу чтения и записи для своего класса под названием «Платформы». Я пытаюсь использовать тип, который я создал как scala enum, но я не знаю, как должен быть определен синтаксис чтения/записи. Может ли кто-нибудь помочь мне понять правильный синтаксис?

import reactivemongo.bson._

sealed trait PlatformType { def name: String }
case object PROPER extends PlatformType { val name = "PROPER" }
case object TRANSACT extends PlatformType { val name = "TRANSACT" }
case object UPPER extends PlatformType { val name = "UPPPER" }


case class Platforms(
  id: Option[BSONObjectID],
  Platform: PlatformType,
  Active: Boolean,
  SystemIds:List[String],
  creationDate: Option[DateTime],
  updateDate: Option[DateTime])

object Platforms {

 implicit object PlatformsBSONReader extends BSONDocumentReader[Platforms] {
   def read(doc: BSONDocument): Platforms =
     Platforms(
       doc.getAs[BSONObjectID]("_id"), 
       doc.getAs[PlatformType]("Platform").get, 
       doc.getAs[Boolean]("Active").get,
       doc.getAs[List[String]]("SystemIds").get, 
       doc.getAs[BSONDateTime]("creationDate").map(dt => new DateTime(dt.value)),
       doc.getAs[BSONDateTime]("updateDate").map(dt => new DateTime(dt.value)))
 }  

 implicit object PlatformsBSONWriter extends BSONDocumentWriter[Platforms] {
    def write(platforms: Platforms): BSONDocument =
      BSONDocument(
        "_id" -> platforms.id.getOrElse(BSONObjectID.generate),
        "Platform" -> platforms.Platform,
        "Active" -> platforms.Active,
        "SystemIds" -> platforms.SystemIds,
        "creationDate" -> platforms.creationDate.map(date => BSONDateTime(date.getMillis)),
        "updateDate" -> platforms.updateDate.map(date => BSONDateTime(date.getMillis)))
  } 
}

person pitchblack408    schedule 11.07.2015    source источник
comment
В типах enum нет ничего конкретного для предоставления классов типов BSON. Это простая черта или класс, для которого вы можете предоставить BSONWriter и BSONReader.   -  person cchantep    schedule 12.07.2015
comment
Можете ли вы показать мне синтаксис, который вы бы использовали? Я новичок в scala, и я немного смущен тем, как определяется перечисление.   -  person pitchblack408    schedule 12.07.2015


Ответы (1)


Для PlatformType

implicit object PTW extends BSONWriter[PlatformType, BSONString] {
  def write(t: PlatformType): BSONString = BSONString(n.type)
}
implicit object PTR extends BSONReader[BSONValue, PlatformType] {
  def read(bson: BSONValue): PlatformType = bson match {
    case BSONString("PROPER") => PROPER
    // ...
  }
}

В Интернете есть документация о средствах чтения и записи BSON в ReactiveMongo.

person cchantep    schedule 12.07.2015