All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.tochkak.plugin.salat.Binders.scala Maven / Gradle / Ivy

package ru.tochkak.plugin.salat

import org.bson.types.ObjectId
import play.api.data.validation.ValidationError
import play.api.libs.json._
import play.api.mvc._

object Binders {

  type ObjectId = org.bson.types.ObjectId

  /**
    * QueryString binder for ObjectId
    */
  implicit def objectIdQueryStringBindable = new QueryStringBindable[ObjectId] {
    def bind(key: String, params: Map[String, Seq[String]]) = {
      params.get(key).flatMap(_.headOption).map { value =>
        if (ObjectId.isValid(value))
          Right(new ObjectId(value))
        else
          Left("Cannot parse parameter " + key + " as ObjectId")
      }
    }

    def unbind(key: String, value: ObjectId) = key + "=" + value.toString
  }

  /**
    * Path binder for ObjectId.
    */
  implicit def objectIdPathBindable = new PathBindable[ObjectId] {
    def bind(key: String, value: String): Either[String, ObjectId] = {
      if (ObjectId.isValid(value))
        Right(new ObjectId(value))
      else
        Left("Cannot parse parameter " + key + " as ObjectId")
    }

    def unbind(key: String, value: ObjectId) = value.toString
  }

  /**
    * Convert an ObjectId to a Javascript String
    */
  implicit def objectIdJavascriptLiteral = new JavascriptLiteral[ObjectId] {
    def to(value: ObjectId) = value.toString
  }

  /**
    * Read ObjectId
    */
  implicit object objectIdReads extends Reads[ObjectId] {
    def reads(json: JsValue) = json match {
      case JsString(s) => {
        if (ObjectId.isValid(s))
          JsSuccess(new ObjectId(s))
        else
          JsError(JsonValidationError("validate.error.objectid"))
      }
      case _ => JsError(Seq(JsPath() -> Seq(JsonValidationError("validate.error.expected.jsstring"))))
    }
  }

  /**
    * Write ObjectId
    */
  implicit object objectIdWrites extends Writes[ObjectId] {
    def writes(o: ObjectId) = JsString(o.toString)
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy