diff options
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuicommon/utils')
6 files changed, 99 insertions, 2 deletions
diff --git a/src/main/scala/xyz/driver/pdsuicommon/utils/CharOps.scala b/src/main/scala/xyz/driver/pdsuicommon/utils/CharOps.scala new file mode 100644 index 0000000..42bf92d --- /dev/null +++ b/src/main/scala/xyz/driver/pdsuicommon/utils/CharOps.scala @@ -0,0 +1,31 @@ +package xyz.driver.pdsuicommon.utils + +final class CharOps(val self: Char) extends AnyVal { + + import CharOps._ + + def isSafeWhitespace: Boolean = Whitespace.matches(self) + + def isSafeControl: Boolean = JavaIsoControl.matches(self) +} + +// From Guava +private object CharOps { + + object Whitespace { + private val Table: String = + "\u2002\u3000\r\u0085\u200A\u2005\u2000\u3000" + + "\u2029\u000B\u3000\u2008\u2003\u205F\u3000\u1680" + + "\u0009\u0020\u2006\u2001\u202F\u00A0\u000C\u2009" + + "\u3000\u2004\u3000\u3000\u2028\n\u2007\u3000" + + private val Multiplier: Int = 1682554634 + private val Shift: Int = Integer.numberOfLeadingZeros(Table.length - 1) + + def matches(c: Char): Boolean = Table.charAt((Multiplier * c) >>> Shift) == c + } + + object JavaIsoControl { + def matches(c: Char): Boolean = c <= '\u001f' || (c >= '\u007f' && c <= '\u009f') + } +} diff --git a/src/main/scala/xyz/driver/pdsuicommon/utils/FutureUtils.scala b/src/main/scala/xyz/driver/pdsuicommon/utils/FutureUtils.scala index 9eecb7f..e8b1f5c 100644 --- a/src/main/scala/xyz/driver/pdsuicommon/utils/FutureUtils.scala +++ b/src/main/scala/xyz/driver/pdsuicommon/utils/FutureUtils.scala @@ -1,7 +1,7 @@ package xyz.driver.pdsuicommon.utils import scala.concurrent.{ExecutionContext, Future} -import scala.util.Try +import scala.util.{Failure, Try} object FutureUtils { @@ -13,6 +13,6 @@ object FutureUtils { override def execute(runnable: Runnable): Unit = runnable.run() } } - future.value.get + future.value.getOrElse(Failure(new IllegalStateException("Can not evaluate the result of future"))) } } diff --git a/src/main/scala/xyz/driver/pdsuicommon/utils/Implicits.scala b/src/main/scala/xyz/driver/pdsuicommon/utils/Implicits.scala index c8af125..9411beb 100644 --- a/src/main/scala/xyz/driver/pdsuicommon/utils/Implicits.scala +++ b/src/main/scala/xyz/driver/pdsuicommon/utils/Implicits.scala @@ -1,5 +1,8 @@ package xyz.driver.pdsuicommon.utils +import play.api.libs.json.JsResult +import xyz.driver.pdsuicommon.json.JsResultOps + import scala.collection.generic.CanBuildFrom object Implicits { @@ -19,4 +22,8 @@ object Implicits { new ConditionalAppend[U, T](c) implicit def toMapOps[K, V](x: Map[K, V]): MapOps[K, V] = new MapOps(x) + + implicit def toCharOps(self: Char): CharOps = new CharOps(self) + implicit def toStringOps(self: String): StringOps = new StringOps(self) + implicit def toJsResultOps[T](self: JsResult[T]): JsResultOps[T] = new JsResultOps(self) } diff --git a/src/main/scala/xyz/driver/pdsuicommon/utils/StringOps.scala b/src/main/scala/xyz/driver/pdsuicommon/utils/StringOps.scala new file mode 100644 index 0000000..b38721e --- /dev/null +++ b/src/main/scala/xyz/driver/pdsuicommon/utils/StringOps.scala @@ -0,0 +1,23 @@ +package xyz.driver.pdsuicommon.utils + +import xyz.driver.pdsuicommon.utils.Implicits.toCharOps + +final class StringOps(val self: String) extends AnyVal { + + def safeTrim: String = { + def shouldKeep(c: Char): Boolean = !c.isSafeControl && !c.isSafeWhitespace + + if (self.isEmpty) { + "" + } else { + val start = self.indexWhere(shouldKeep) + val end = self.lastIndexWhere(shouldKeep) + + if (start >= 0 && end >= 0) { + self.substring(start, end + 1) + } else { + "" + } + } + } +} diff --git a/src/main/scala/xyz/driver/pdsuicommon/utils/WriteableImplicits.scala b/src/main/scala/xyz/driver/pdsuicommon/utils/WriteableImplicits.scala new file mode 100644 index 0000000..2c66a23 --- /dev/null +++ b/src/main/scala/xyz/driver/pdsuicommon/utils/WriteableImplicits.scala @@ -0,0 +1,15 @@ +package xyz.driver.pdsuicommon.utils + +import play.api.http.{ContentTypes, Writeable} +import play.api.libs.json.{Json, Writes} + +// @TODO this should be an object with a method, that gets HTTP-headers and returns suitable Writeable +trait WriteableImplicits { + + // Write JSON by default at now + implicit def defaultWriteable[T](implicit inner: Writes[T]) = Writeable[T]( + { x: T => Writeable.writeableOf_JsValue.transform(Json.toJson(x)) }, + Option(ContentTypes.JSON) + ) + +} diff --git a/src/main/scala/xyz/driver/pdsuicommon/utils/WritesUtils.scala b/src/main/scala/xyz/driver/pdsuicommon/utils/WritesUtils.scala new file mode 100644 index 0000000..fa05e96 --- /dev/null +++ b/src/main/scala/xyz/driver/pdsuicommon/utils/WritesUtils.scala @@ -0,0 +1,21 @@ +package xyz.driver.pdsuicommon.utils + +import play.api.libs.json._ + +object WritesUtils { + + def filterKeys[T](p: String => Boolean)(implicit w: Writes[T]): Writes[T] = { + filter { + case (key, _) => p(key) + } + } + + def filter[T](p: (String, JsValue) => Boolean)(implicit w: Writes[T]): Writes[T] = { + w.transform { input: JsValue => + input match { + case JsObject(map) => JsObject(map.filter(Function.tupled(p))) + case x => x + } + } + } +} |