From 8e2e4d0e93c33b61ec7aae3edb992400f77d51a3 Mon Sep 17 00:00:00 2001 From: adamw Date: Mon, 24 Jul 2017 17:46:34 +0200 Subject: Splitting the model package into files, adding Xlint to compiler options --- .../scala/com/softwaremill/sttp/RequestT.scala | 2 + .../scala/com/softwaremill/sttp/model/Method.scala | 14 ++++ .../com/softwaremill/sttp/model/RequestBody.scala | 21 ++++++ .../com/softwaremill/sttp/model/ResponseAs.scala | 41 +++++++++++ .../com/softwaremill/sttp/model/package.scala | 81 ---------------------- .../main/scala/com/softwaremill/sttp/package.scala | 9 ++- 6 files changed, 85 insertions(+), 83 deletions(-) create mode 100644 core/src/main/scala/com/softwaremill/sttp/model/Method.scala create mode 100644 core/src/main/scala/com/softwaremill/sttp/model/RequestBody.scala create mode 100644 core/src/main/scala/com/softwaremill/sttp/model/ResponseAs.scala delete mode 100644 core/src/main/scala/com/softwaremill/sttp/model/package.scala (limited to 'core/src') diff --git a/core/src/main/scala/com/softwaremill/sttp/RequestT.scala b/core/src/main/scala/com/softwaremill/sttp/RequestT.scala index be257dd..1aa8770 100644 --- a/core/src/main/scala/com/softwaremill/sttp/RequestT.scala +++ b/core/src/main/scala/com/softwaremill/sttp/RequestT.scala @@ -10,6 +10,8 @@ import com.softwaremill.sttp.model._ import scala.collection.immutable.Seq +import scala.language.higherKinds + /** * @tparam U Specifies if the method & uri are specified. By default can be * either: diff --git a/core/src/main/scala/com/softwaremill/sttp/model/Method.scala b/core/src/main/scala/com/softwaremill/sttp/model/Method.scala new file mode 100644 index 0000000..6f2ea68 --- /dev/null +++ b/core/src/main/scala/com/softwaremill/sttp/model/Method.scala @@ -0,0 +1,14 @@ +package com.softwaremill.sttp.model + +case class Method(m: String) extends AnyVal +object Method { + val GET = Method("GET") + val HEAD = Method("HEAD") + val POST = Method("POST") + val PUT = Method("PUT") + val DELETE = Method("DELETE") + val OPTIONS = Method("OPTIONS") + val PATCH = Method("PATCH") + val CONNECT = Method("CONNECT") + val TRACE = Method("TRACE") +} diff --git a/core/src/main/scala/com/softwaremill/sttp/model/RequestBody.scala b/core/src/main/scala/com/softwaremill/sttp/model/RequestBody.scala new file mode 100644 index 0000000..0c737f0 --- /dev/null +++ b/core/src/main/scala/com/softwaremill/sttp/model/RequestBody.scala @@ -0,0 +1,21 @@ +package com.softwaremill.sttp.model + +import java.io.InputStream +import java.nio.ByteBuffer +import java.nio.file.Path + +import com.softwaremill.sttp.BodySerializer + +sealed trait RequestBody[+S] +case object NoBody extends RequestBody[Nothing] +case class SerializableBody[T](f: BodySerializer[T], t: T) + extends RequestBody[Nothing] + +sealed trait BasicRequestBody extends RequestBody[Nothing] +case class StringBody(s: String, encoding: String) extends BasicRequestBody +case class ByteArrayBody(b: Array[Byte]) extends BasicRequestBody +case class ByteBufferBody(b: ByteBuffer) extends BasicRequestBody +case class InputStreamBody(b: InputStream) extends BasicRequestBody +case class PathBody(f: Path) extends BasicRequestBody + +case class StreamBody[S](s: S) extends RequestBody[S] diff --git a/core/src/main/scala/com/softwaremill/sttp/model/ResponseAs.scala b/core/src/main/scala/com/softwaremill/sttp/model/ResponseAs.scala new file mode 100644 index 0000000..4724292 --- /dev/null +++ b/core/src/main/scala/com/softwaremill/sttp/model/ResponseAs.scala @@ -0,0 +1,41 @@ +package com.softwaremill.sttp.model + +import java.net.URLDecoder + +import scala.collection.immutable.Seq + +/** + * @tparam T Target type as which the response will be read. + * @tparam S If `T` is a stream, the type of the stream. Otherwise, `Nothing`. + */ +sealed trait ResponseAs[T, +S] { + def map[T2](f: T => T2): ResponseAs[T2, S] = + MappedResponseAs[T, T2, S](this, f) +} + +case object IgnoreResponse extends ResponseAs[Unit, Nothing] +case class ResponseAsString(encoding: String) + extends ResponseAs[String, Nothing] +case object ResponseAsByteArray extends ResponseAs[Array[Byte], Nothing] +case class ResponseAsParams(encoding: String) + extends ResponseAs[Seq[(String, String)], Nothing] { + + private[sttp] def parse(s: String): Seq[(String, String)] = { + s.split("&") + .toList + .flatMap(kv => + kv.split("=", 2) match { + case Array(k, v) => + Some( + (URLDecoder.decode(k, encoding), URLDecoder.decode(v, encoding))) + case _ => None + }) + } +} +case class ResponseAsStream[T, S]()(implicit val responseIsStream: S =:= T) + extends ResponseAs[T, S] +case class MappedResponseAs[T, T2, S](raw: ResponseAs[T, S], g: T => T2) + extends ResponseAs[T2, S] { + override def map[T3](f: T2 => T3): ResponseAs[T3, S] = + MappedResponseAs[T, T3, S](raw, g andThen f) +} diff --git a/core/src/main/scala/com/softwaremill/sttp/model/package.scala b/core/src/main/scala/com/softwaremill/sttp/model/package.scala deleted file mode 100644 index e0b4048..0000000 --- a/core/src/main/scala/com/softwaremill/sttp/model/package.scala +++ /dev/null @@ -1,81 +0,0 @@ -package com.softwaremill.sttp - -import java.io.InputStream -import java.net.URLDecoder -import java.nio.ByteBuffer -import java.nio.file.Path - -import scala.language.higherKinds -import scala.collection.immutable.Seq - -package object model { - case class Method(m: String) extends AnyVal - object Method { - val GET = Method("GET") - val HEAD = Method("HEAD") - val POST = Method("POST") - val PUT = Method("PUT") - val DELETE = Method("DELETE") - val OPTIONS = Method("OPTIONS") - val PATCH = Method("PATCH") - val CONNECT = Method("CONNECT") - val TRACE = Method("TRACE") - } - - /** - * Provide an implicit value of this type to serialize arbitrary classes into a request body. - * Handlers might also provide special logic for serializer instances which they define (e.g. to handle streaming). - */ - type BodySerializer[B] = B => BasicRequestBody - - sealed trait RequestBody[+S] - case object NoBody extends RequestBody[Nothing] - case class SerializableBody[T](f: BodySerializer[T], t: T) - extends RequestBody[Nothing] - - sealed trait BasicRequestBody extends RequestBody[Nothing] - case class StringBody(s: String, encoding: String) extends BasicRequestBody - case class ByteArrayBody(b: Array[Byte]) extends BasicRequestBody - case class ByteBufferBody(b: ByteBuffer) extends BasicRequestBody - case class InputStreamBody(b: InputStream) extends BasicRequestBody - case class PathBody(f: Path) extends BasicRequestBody - - case class StreamBody[S](s: S) extends RequestBody[S] - - /** - * @tparam T Target type as which the response will be read. - * @tparam S If `T` is a stream, the type of the stream. Otherwise, `Nothing`. - */ - sealed trait ResponseAs[T, +S] { - def map[T2](f: T => T2): ResponseAs[T2, S] = - MappedResponseAs[T, T2, S](this, f) - } - - case object IgnoreResponse extends ResponseAs[Unit, Nothing] - case class ResponseAsString(encoding: String) - extends ResponseAs[String, Nothing] - case object ResponseAsByteArray extends ResponseAs[Array[Byte], Nothing] - case class ResponseAsParams(encoding: String) - extends ResponseAs[Seq[(String, String)], Nothing] { - - private[sttp] def parse(s: String): Seq[(String, String)] = { - s.split("&") - .toList - .flatMap(kv => - kv.split("=", 2) match { - case Array(k, v) => - Some( - (URLDecoder.decode(k, encoding), - URLDecoder.decode(v, encoding))) - case _ => None - }) - } - } - case class ResponseAsStream[T, S]()(implicit val responseIsStream: S =:= T) - extends ResponseAs[T, S] - case class MappedResponseAs[T, T2, S](raw: ResponseAs[T, S], g: T => T2) - extends ResponseAs[T2, S] { - override def map[T3](f: T2 => T3): ResponseAs[T3, S] = - MappedResponseAs[T, T3, S](raw, g andThen f) - } -} diff --git a/core/src/main/scala/com/softwaremill/sttp/package.scala b/core/src/main/scala/com/softwaremill/sttp/package.scala index ccc79ac..5e7b13c 100644 --- a/core/src/main/scala/com/softwaremill/sttp/package.scala +++ b/core/src/main/scala/com/softwaremill/sttp/package.scala @@ -1,10 +1,9 @@ package com.softwaremill import java.io.{File, InputStream} -import java.net.{URI, URLEncoder} +import java.net.URI import java.nio.ByteBuffer import java.nio.file.Path -import java.util.Base64 import com.softwaremill.sttp.model._ @@ -24,6 +23,12 @@ package object sttp { ".get(...), .post(...) etc. to obtain a non-partial request.") private[sttp] type IsIdInRequest[U[_]] = U[Unit] =:= Id[Unit] + /** + * Provide an implicit value of this type to serialize arbitrary classes into a request body. + * Handlers might also provide special logic for serializer instances which they define (e.g. to handle streaming). + */ + type BodySerializer[B] = B => BasicRequestBody + // constants private[sttp] val ContentTypeHeader = "Content-Type" -- cgit v1.2.3