From 647c9ac74bb76fe79716fee9c499355b355caf8c Mon Sep 17 00:00:00 2001 From: Josh Lemer Date: Sat, 23 Dec 2017 10:56:32 -0600 Subject: Add TryMonad, implement a delegating TryBackend --- .../scala/com/softwaremill/sttp/MonadError.scala | 8 ++++++ .../scala/com/softwaremill/sttp/TryBackend.scala | 29 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 core/src/main/scala/com/softwaremill/sttp/TryBackend.scala 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)) +} -- cgit v1.2.3