aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuicommon/parsers/DimensionsParser.scala
diff options
context:
space:
mode:
authorJakob Odersky <jakob@driver.xyz>2017-08-02 13:38:49 -0700
committerJakob Odersky <jakob@driver.xyz>2017-08-16 19:26:10 -0700
commit985ee69beed836b97f3476306736d3f15ce37e1c (patch)
tree73a5ecb25c3162d574febe5d39cbb1fafaace699 /src/main/scala/xyz/driver/pdsuicommon/parsers/DimensionsParser.scala
parent322ea28ecf5ad5f65d3376f3e97e004d229d4736 (diff)
downloadrest-query-985ee69beed836b97f3476306736d3f15ce37e1c.tar.gz
rest-query-985ee69beed836b97f3476306736d3f15ce37e1c.tar.bz2
rest-query-985ee69beed836b97f3476306736d3f15ce37e1c.zip
Add parsers to common
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuicommon/parsers/DimensionsParser.scala')
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/parsers/DimensionsParser.scala33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/main/scala/xyz/driver/pdsuicommon/parsers/DimensionsParser.scala b/src/main/scala/xyz/driver/pdsuicommon/parsers/DimensionsParser.scala
new file mode 100644
index 0000000..147102b
--- /dev/null
+++ b/src/main/scala/xyz/driver/pdsuicommon/parsers/DimensionsParser.scala
@@ -0,0 +1,33 @@
+package xyz.driver.server.parsers
+
+import play.api.libs.json._
+import play.api.routing.sird._
+import xyz.driver.pdsuicommon.utils.WritesUtils
+
+import scala.util.{Failure, Success, Try}
+
+class Dimensions(private val xs: Set[String] = Set.empty) {
+ def contains(x: String): Boolean = xs.isEmpty || xs.contains(x)
+}
+
+object DimensionsParser {
+
+ private class DimensionsWrapper[T](dimensions: Dimensions)(implicit orig: Writes[T]) extends Writes[T] {
+ private val filteredWrites = WritesUtils.filterKeys[T](dimensions.contains)
+ override def writes(o: T): JsValue = filteredWrites.writes(o)
+ }
+
+ def tryParse(queryString: QueryString): Try[Dimensions] = {
+ val rawDimensions = queryString.getOrElse("dimensions", Seq.empty)
+ rawDimensions match {
+ case Nil => Success(new Dimensions())
+
+ case x +: Nil =>
+ val raw: Set[String] = x.split(",").view.map(_.trim).filter(_.nonEmpty).to[Set]
+ Success(new Dimensions(raw))
+
+ case xs =>
+ Failure(new IllegalArgumentException(s"Dimensions are specified ${xs.size} times"))
+ }
+ }
+}