aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Lemer <joshlemer@gmail.com>2017-12-23 10:56:32 -0600
committerJosh Lemer <joshlemer@gmail.com>2017-12-23 10:56:32 -0600
commit647c9ac74bb76fe79716fee9c499355b355caf8c (patch)
treefcfff923368844d046780850642c28a240c2a705
parentd4e065dc3c8b80db24a96c83ddcca10b7aedc684 (diff)
downloadsttp-647c9ac74bb76fe79716fee9c499355b355caf8c.tar.gz
sttp-647c9ac74bb76fe79716fee9c499355b355caf8c.tar.bz2
sttp-647c9ac74bb76fe79716fee9c499355b355caf8c.zip
Add TryMonad, implement a delegating TryBackend
-rw-r--r--core/src/main/scala/com/softwaremill/sttp/MonadError.scala8
-rw-r--r--core/src/main/scala/com/softwaremill/sttp/TryBackend.scala29
2 files changed, 37 insertions, 0 deletions
diff --git a/core/src/main/scala/com/softwaremill/sttp/MonadError.scala b/core/src/main/scala/com/softwaremill/sttp/MonadError.scala
index 77c6235..0dcc02c 100644
--- a/core/src/main/scala/com/softwaremill/sttp/MonadError.scala
+++ b/core/src/main/scala/com/softwaremill/sttp/MonadError.scala
@@ -41,7 +41,15 @@ object IdMonad extends MonadError[Id] {
override protected def handleWrappedError[T](rt: Id[T])(
h: PartialFunction[Throwable, Id[T]]): Id[T] = rt
}
+object TryMonad extends MonadError[Try] {
+ override def unit[T](t: T): Try[T] = Success(t)
+ override def map[T, T2](fa: Try[T])(f: (T) => T2): Try[T2] = fa.map(f)
+ override def flatMap[T, T2](fa: Try[T])(f: (T) => Try[T2]): Try[T2] = fa.flatMap(f)
+ override def error[T](t: Throwable): Try[T] = Failure(t)
+ override protected def handleWrappedError[T](rt: Try[T])(
+ h: PartialFunction[Throwable, Try[T]]): Try[T] = rt.recoverWith(h)
+}
class FutureMonad(implicit ec: ExecutionContext)
extends MonadAsyncError[Future] {
diff --git a/core/src/main/scala/com/softwaremill/sttp/TryBackend.scala b/core/src/main/scala/com/softwaremill/sttp/TryBackend.scala
new file mode 100644
index 0000000..267259c
--- /dev/null
+++ b/core/src/main/scala/com/softwaremill/sttp/TryBackend.scala
@@ -0,0 +1,29 @@
+package com.softwaremill.sttp
+
+import java.net.HttpURLConnection
+
+import scala.util.Try
+
+/** A Backend that safely wraps SttpBackend exceptions in Try's
+ *
+ * @param delegate An SttpBackend which to which this backend forwards all requests
+ * @tparam S The type of streams that are supported by the backend. `Nothing`,
+ * if streaming requests/responses is not supported by this backend.
+ */
+class TryBackend[-S](delegate: SttpBackend[Id, S]) extends SttpBackend[Try, S] {
+ override def send[T](request: Request[T, S]): Try[Response[T]] =
+ Try(delegate.send(request))
+
+ override def close(): Unit = delegate.close()
+
+ override def responseMonad: MonadError[Try] = TryMonad
+}
+
+object TryBackend {
+ def apply(options: SttpBackendOptions = SttpBackendOptions.Default,
+ customizeConnection: HttpURLConnection => Unit = { _ =>
+ ()
+ }): SttpBackend[Try, Nothing] =
+ new TryBackend[Nothing](
+ HttpURLConnectionBackend(options, customizeConnection))
+}