package finch
This is a root package of the Finch library, which provides an immutable layer of functions and types atop of Finagle for writing lightweight HTTP services.
- Source
- package.scala
- Alphabetic
- By Inheritance
- finch
- ValidationRules
- Outputs
- Endpoints
- FileUploadsAndAttributes
- Cookies
- ParamAndParams
- Headers
- Paths
- Bodies
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Type Members
-
abstract
class
Accept extends AnyRef
Models an HTTP Accept header (see RFC2616, 14.1).
Models an HTTP Accept header (see RFC2616, 14.1).
- Note
This API doesn't validate the input primary/sub types.
- See also
https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
-
class
Bootstrap[ES <: HList, CTS <: HList] extends AnyRef
Bootstraps a Finagle HTTP service out of the collection of Finch endpoints.
Bootstraps a Finagle HTTP service out of the collection of Finch endpoints.
val api: Service[Request, Response] = Bootstrap .configure(negotiateContentType = true, enableMethodNotAllowed = true) .serve[Application.Json](getUser :+: postUser) .serve[Text.Plain](healthcheck) .toService
Supported Configuration Options
-
includeDateHeader
(default:true
): whether or not to include the Date header into each response (see RFC2616, section 14.18)-
includeServerHeader
(default:true
): whether or not to include the Server header into each response (see RFC2616, section 14.38)-
negotiateContentType
(default:false
): whether or not to enable server-driven content type negotiation (see RFC2616, section 12.1)-
enableMethodNotAllowed
(default:false
): whether or not to enable 405 MethodNotAllowed HTTP response (see RFC2616, section 10.4.6)- See also
https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
https://www.w3.org/Protocols/rfc2616/rfc2616-sec12.html
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
-
trait
Decode[A] extends AnyRef
Decodes an HTTP payload represented as Buf (encoded with Charset) into an arbitrary type
A
. -
trait
DecodeEntity[A] extends AnyRef
Decodes an HTTP entity (eg: header, query-string param) represented as UTF-8
String
into an arbitrary typeA
. -
trait
DecodePath[A] extends AnyRef
Decodes an HTTP path (eg: /foo/bar/baz) represented as UTF-8
String
into an arbitrary typeA
. -
trait
Encode[A] extends AnyRef
Encodes an HTTP payload (represented as an arbitrary type
A
) with a given Charset. -
trait
Endpoint[A] extends AnyRef
An
Endpoint
represents the HTTP endpoint.An
Endpoint
represents the HTTP endpoint.It is well known and widely adopted in Finagle that "Your Server is a Function" (i.e.,
Request => Future[Response]
). In a REST/HTTP API setting this function may be viewed asRequest =1=> (A =2=> Future[B]) =3=> Future[Response]
, where transformation1
is a request decoding (deserialization), transformation2
- is a business logic and transformation3
is - a response encoding (serialization). The only interesting part here is transformation2
(i.e.,A => Future[B]
), which represents an application business.An
Endpoint
transformation (map
,mapAsync
, etc.) encodes the business logic, while the rest of Finch ecosystem takes care about both serialization and deserialization.A typical way to transform (or map) the
Endpoint
is to use io.finch.syntax.Mapper:import io.finch._ case class Foo(i: Int) case class Bar(s: String) val foo: Endpoint[Foo] = get("foo") { Ok(Foo(42)) } val bar: Endpoint[Bar] = get("bar" :: path[String]) { s: String => Ok(Bar(s)) }
Endpoint
s are also composable in terms of or-else combinator (known as a "space invader" operator:+:
) that takes twoEndpoint
s and returns a coproductEndpoint
.import io.finch._ val foobar: Endpoint[Foo :+: Bar :+: CNil] = foo :+: bar
An
Endpoint
might be converted into a Finagle Service withEndpoint.toService
method so it can be served within Finagle HTTP.import com.twitter.finagle.Http Http.server.serve(foobar.toService)
-
sealed abstract
class
EndpointResult[+A] extends AnyRef
A result returned from an Endpoint.
A result returned from an Endpoint. This models
Option[(Input, Future[Output])]
and represents two cases:- Endpoint is matched (think of 200).
- Endpoint is not matched (think of 404, 405, etc).
In its current state,
EndpointResult.NotMatched
represented with two cases:EndpointResult.NotMatched
(very generic result usually indicating 404)EndpointResult.NotMatched.MethodNotAllowed
(indicates 405)
API methods exposed on this type are mostly introduced for testing.
This class also provides various of
awaitX
methods useful for testing and experimenting. -
trait
Endpoints extends Bodies with Paths with Headers with ParamAndParams with Cookies with FileUploadsAndAttributes
A collection of Endpoint combinators.
-
sealed abstract
class
Error extends Exception with NoStackTrace
A single error from an Endpoint.
A single error from an Endpoint.
This indicates that one of the Finch's built-in components failed. This includes, but not limited by:
- reading a required param, body, header, etc. - parsing a string-based endpoint with
.as[T]
combinator - validating an endpoint with.should
orshouldNot
combinators -
case class
Errors(errors: NonEmptyList[Error]) extends Exception with NoStackTrace with Product with Serializable
Multiple errors from an Endpoint.
- trait HighPriorityDecode extends LowPriorityDecode
- trait HighPriorityEncodeInstances extends LowPriorityEncodeInstances
- trait HighPriorityToResponseInstances extends LowPriorityToResponseInstances
-
final
case class
Input(request: Request, route: Seq[String]) extends Product with Serializable
An input for Endpoint that glues two individual pieces together:
An input for Endpoint that glues two individual pieces together:
- Finagle's Request needed for evaluating (e.g.,
body
,param
) - Finch's route (represented asSeq[String]
) needed for matching (e.g.,path
) - trait IterateeInstances extends LowPriorityInstances
- trait LowPriorityDecode extends AnyRef
- trait LowPriorityEncodeInstances extends AnyRef
- trait LowPriorityInstances extends FutureModule
- trait LowPriorityToResponseInstances extends AnyRef
-
sealed
trait
Output[+A] extends AnyRef
An output of Endpoint.
- trait Outputs extends AnyRef
-
trait
ToResponse[A] extends AnyRef
Represents a conversion from
A
to Response. -
trait
ToService[ES <: HList, CTS <: HList] extends AnyRef
Wraps a given list of Endpoints and their content-types with a Finagle Service.
Wraps a given list of Endpoints and their content-types with a Finagle Service.
Guarantees to:
- handle Finch's own errors (i.e., Error and Error) as 400s - copy requests's HTTP version onto a response - respond with 404 when an endpoint is not matched - respond with 405 when an endpoint is not matched because method wasn't allowed (serve back an
Allow
header) - include the date header on each response (unless disabled) - include the server header on each response (unless disabled)- Annotations
- @implicitNotFound( ... )
-
sealed
trait
Trace extends AnyRef
Models a trace of a matched Endpoint.
Models a trace of a matched Endpoint. For example,
/hello/:name
.- Note
represented as a linked-list-like structure for efficiency.
-
trait
ValidationRule[A] extends AnyRef
A
ValidationRule
enables a reusable way of defining a validation rules in the application domain.A
ValidationRule
enables a reusable way of defining a validation rules in the application domain. It might be composed with Endpoints using either shouldor
shouldNotmethods and with other
ValidationRules using logical methods
andand
or.
case class User(name: String, age: Int) val user: Endpoint[User] = ( param("name").validate(beLongerThan(3)) :: param("age").as[Int].should(beGreaterThan(0) and beLessThan(120)) ).as[User]
- trait ValidationRules extends AnyRef
Value Members
-
def
Accepted[A]: Output[A]
- Definition Classes
- Outputs
-
def
BadGateway(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
BadRequest(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
Conflict(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
Created[A](a: A): Output[A]
- Definition Classes
- Outputs
-
def
EnhanceYourCalm(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
Forbidden(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
GatewayTimeout(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
Gone(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
InsufficientStorage(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
InternalServerError(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
LengthRequired(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
MethodNotAllowed(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
NoContent[A]: Output[A]
- Definition Classes
- Outputs
-
def
NotAcceptable(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
NotFound(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
NotImplemented(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
Ok[A](a: A): Output[A]
- Definition Classes
- Outputs
-
def
PaymentRequired(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
PreconditionFailed(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
RequestEntityTooLarge(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
RequestTimeout(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
RequestedRangeNotSatisfiable(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
ServiceUnavailable(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
TooManyRequests(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
Unauthorized(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
def
UnprocessableEntity(cause: Exception): Output[Nothing]
- Definition Classes
- Outputs
-
val
asyncBody: Endpoint[AsyncStream[Buf]]
An evaluating Endpoint that reads a required chunked streaming binary body, interpreted as an
AsyncStream[Buf]
. -
def
beGreaterThan[A](n: A)(implicit ev: Numeric[A]): ValidationRule[A]
A ValidationRule that makes sure the numeric value is greater than given
n
.A ValidationRule that makes sure the numeric value is greater than given
n
.- Definition Classes
- ValidationRules
-
def
beLessThan[A](n: A)(implicit ev: Numeric[A]): ValidationRule[A]
A ValidationRule that makes sure the numeric value is less than given
n
.A ValidationRule that makes sure the numeric value is less than given
n
.- Definition Classes
- ValidationRules
-
def
beLongerThan(n: Int): ValidationRule[String]
A ValidationRule that makes sure the string value is longer than
n
symbols.A ValidationRule that makes sure the string value is longer than
n
symbols.- Definition Classes
- ValidationRules
-
def
beShorterThan(n: Int): ValidationRule[String]
A ValidationRule that makes sure the string value is shorter than
n
symbols.A ValidationRule that makes sure the string value is shorter than
n
symbols.- Definition Classes
- ValidationRules
-
val
binaryBody: Endpoint[Array[Byte]]
An evaluating Endpoint that reads a required binary request body, interpreted as an
Array[Byte]
, or throws a Error.NotPresent exception.An evaluating Endpoint that reads a required binary request body, interpreted as an
Array[Byte]
, or throws a Error.NotPresent exception. The returned Endpoint only matches non-chunked (non-streamed) requests.- Definition Classes
- Bodies
-
val
binaryBodyOption: Endpoint[Option[Array[Byte]]]
An evaluating Endpoint that reads a binary request body, interpreted as a
Array[Byte]
, into anOption
. -
def
body[A, CT](implicit d: Dispatchable[A, CT], ct: ClassTag[A]): Endpoint[A]
An Endpoint that reads the required request body represented as
CT
(ContentType
) and interpreted asA
, or throws an Error.NotPresent exception.An Endpoint that reads the required request body represented as
CT
(ContentType
) and interpreted asA
, or throws an Error.NotPresent exception. The returned Endpoint only matches non-chunked (non-streamed) requests.- Definition Classes
- Bodies
-
def
bodyOption[A, CT](implicit d: Dispatchable[A, CT], ct: ClassTag[A]): Endpoint[Option[A]]
An Endpoint that reads an optional request body represented as
CT
(ContentType
) and interpreted asA
, into anOption
. -
implicit
def
booleanToPath(b: Boolean): Endpoint[HNil]
- Definition Classes
- Paths
-
def
cookie(name: String): Endpoint[Cookie]
An evaluating Endpoint that reads a required cookie from the request or raises an Error.NotPresent exception when the cookie is missing.
An evaluating Endpoint that reads a required cookie from the request or raises an Error.NotPresent exception when the cookie is missing.
- Definition Classes
- Cookies
-
def
cookieOption(name: String): Endpoint[Option[Cookie]]
An evaluating Endpoint that reads an optional HTTP cookie from the request into an
Option
.An evaluating Endpoint that reads an optional HTTP cookie from the request into an
Option
.- Definition Classes
- Cookies
-
def
header[A](name: String)(implicit d: DecodeEntity[A], tag: ClassTag[A]): Endpoint[A]
An evaluating Endpoint that reads a required HTTP header
name
from the request or raises an Error.NotPresent exception when the header is missing.An evaluating Endpoint that reads a required HTTP header
name
from the request or raises an Error.NotPresent exception when the header is missing.- Definition Classes
- Headers
-
def
headerOption[A](name: String)(implicit d: DecodeEntity[A], tag: ClassTag[A]): Endpoint[Option[A]]
An evaluating Endpoint that reads an optional HTTP header
name
from the request into anOption
.An evaluating Endpoint that reads an optional HTTP header
name
from the request into anOption
.- Definition Classes
- Headers
-
implicit
def
intToPath(i: Int): Endpoint[HNil]
- Definition Classes
- Paths
-
def
jsonBody[A](implicit arg0: Json[A], arg1: ClassTag[A]): Endpoint[A]
Alias for
body[A, Application.Json]
.Alias for
body[A, Application.Json]
.- Definition Classes
- Bodies
-
def
jsonBodyOption[A](implicit arg0: Json[A], arg1: ClassTag[A]): Endpoint[Option[A]]
Alias for
bodyOption[A, Application.Json]
.Alias for
bodyOption[A, Application.Json]
.- Definition Classes
- Bodies
-
def
multipartAttribute[A](name: String)(implicit d: DecodeEntity[A], tag: ClassTag[A]): Endpoint[A]
An evaluating Endpoint that reads a required attribute from a
multipart/form-data
request.An evaluating Endpoint that reads a required attribute from a
multipart/form-data
request.- Definition Classes
- FileUploadsAndAttributes
-
def
multipartAttributeOption[A](name: String)(implicit d: DecodeEntity[A], tag: ClassTag[A]): Endpoint[Option[A]]
An evaluating Endpoint that reads an optional attribute from a
multipart/form-data
request.An evaluating Endpoint that reads an optional attribute from a
multipart/form-data
request.- Definition Classes
- FileUploadsAndAttributes
-
def
multipartAttributes[A](name: String)(implicit d: DecodeEntity[A], tag: ClassTag[A]): Endpoint[Seq[A]]
An evaluating Endpoint that reads a required attribute from a
multipart/form-data
request.An evaluating Endpoint that reads a required attribute from a
multipart/form-data
request.- Definition Classes
- FileUploadsAndAttributes
-
def
multipartAttributesNel[A](name: String)(implicit d: DecodeEntity[A], t: ClassTag[A]): Endpoint[NonEmptyList[A]]
An evaluating Endpoint that reads a required attribute from a
multipart/form-data
request.An evaluating Endpoint that reads a required attribute from a
multipart/form-data
request.- Definition Classes
- FileUploadsAndAttributes
-
def
multipartFileUpload(name: String): Endpoint[FileUpload]
An evaluating Endpoint that reads a required file upload from a
multipart/form-data
request.An evaluating Endpoint that reads a required file upload from a
multipart/form-data
request.- Definition Classes
- FileUploadsAndAttributes
-
def
multipartFileUploadOption(name: String): Endpoint[Option[FileUpload]]
An evaluating Endpoint that reads an optional file upload from a
multipart/form-data
request into anOption
.An evaluating Endpoint that reads an optional file upload from a
multipart/form-data
request into anOption
.- Definition Classes
- FileUploadsAndAttributes
-
def
multipartFileUploads(name: String): Endpoint[Seq[FileUpload]]
An evaluating Endpoint that optionally reads multiple file uploads from a
multipart/form-data
request.An evaluating Endpoint that optionally reads multiple file uploads from a
multipart/form-data
request.- Definition Classes
- FileUploadsAndAttributes
-
def
multipartFileUploadsNel(name: String): Endpoint[NonEmptyList[FileUpload]]
An evaluating Endpoint that requires multiple file uploads from a
multipart/form-data
request.An evaluating Endpoint that requires multiple file uploads from a
multipart/form-data
request.- Definition Classes
- FileUploadsAndAttributes
-
def
param[A](name: String)(implicit d: DecodeEntity[A], tag: ClassTag[A]): Endpoint[A]
An evaluating Endpoint that reads a required query-string param
name
from the request or raises an Error.NotPresent exception when the param is missing; an Error.NotValid exception is the param is empty.An evaluating Endpoint that reads a required query-string param
name
from the request or raises an Error.NotPresent exception when the param is missing; an Error.NotValid exception is the param is empty.- Definition Classes
- ParamAndParams
-
def
paramOption[A](name: String)(implicit d: DecodeEntity[A], tag: ClassTag[A]): Endpoint[Option[A]]
An evaluating Endpoint that reads an optional query-string param
name
from the request into anOption
.An evaluating Endpoint that reads an optional query-string param
name
from the request into anOption
.- Definition Classes
- ParamAndParams
-
def
params[A](name: String)(implicit d: DecodeEntity[A], tag: ClassTag[A]): Endpoint[Seq[A]]
An evaluating Endpoint that reads an optional (in a meaning that a resulting
Seq
may be empty) multi-value query-string paramname
from the request into aSeq
.An evaluating Endpoint that reads an optional (in a meaning that a resulting
Seq
may be empty) multi-value query-string paramname
from the request into aSeq
.- Definition Classes
- ParamAndParams
-
def
paramsNel[A](name: String)(implicit d: DecodeEntity[A], tag: ClassTag[A]): Endpoint[NonEmptyList[A]]
An evaluating Endpoint that reads a required multi-value query-string param
name
from the request into aNonEmptyList
or raises a Error.NotPresent exception when the params are missing or empty.An evaluating Endpoint that reads a required multi-value query-string param
name
from the request into aNonEmptyList
or raises a Error.NotPresent exception when the params are missing or empty.- Definition Classes
- ParamAndParams
-
def
path(s: String): Endpoint[HNil]
An Endpoint that matches a given string.
An Endpoint that matches a given string.
- Definition Classes
- Paths
-
def
path[A](implicit arg0: DecodePath[A], arg1: ClassTag[A]): Endpoint[A]
A matching Endpoint that reads a value of type
A
(using the implicit DecodePath instances defined forA
) from the current path segment.A matching Endpoint that reads a value of type
A
(using the implicit DecodePath instances defined forA
) from the current path segment.- Definition Classes
- Paths
-
def
paths[A](implicit arg0: DecodePath[A], arg1: ClassTag[A]): Endpoint[Seq[A]]
A matching Endpoint that reads a tail value
A
(using the implicit DecodePath instances defined forA
) from the entire path.A matching Endpoint that reads a tail value
A
(using the implicit DecodePath instances defined forA
) from the entire path.- Definition Classes
- Paths
-
val
stringBody: Endpoint[String]
An evaluating Endpoint that reads the required request body, interpreted as a
String
, or throws an Error.NotPresent exception.An evaluating Endpoint that reads the required request body, interpreted as a
String
, or throws an Error.NotPresent exception. The returned Endpoint only matches non-chunked (non-streamed) requests.- Definition Classes
- Bodies
-
val
stringBodyOption: Endpoint[Option[String]]
An evaluating Endpoint that reads an optional request body, interpreted as a
String
, into anOption
. -
implicit
def
stringToPath(s: String): Endpoint[HNil]
- Definition Classes
- Paths
-
def
textBody[A](implicit arg0: finch.Decode.Text[A], arg1: ClassTag[A]): Endpoint[A]
Alias for
body[A, Text.Plain]
Alias for
body[A, Text.Plain]
- Definition Classes
- Bodies
-
def
textBodyOption[A](implicit arg0: finch.Decode.Text[A], arg1: ClassTag[A]): Endpoint[Option[A]]
Alias for
bodyOption[A, Text.Plain]
Alias for
bodyOption[A, Text.Plain]
- Definition Classes
- Bodies
- object Accept
- object Application
- object Audio
- object Bootstrap extends Bootstrap[HNil, HNil]
- object Decode
- object DecodeEntity extends HighPriorityDecode
- object DecodePath
- object Encode extends HighPriorityEncodeInstances
-
object
Endpoint
Provides extension methods for Endpoint to support coproduct and path syntax.
- object EndpointResult
-
object
* extends Endpoint[HNil]
An Endpoint that skips all path segments.
-
object
/ extends Endpoint[HNil]
An identity Endpoint.
-
object
root extends Endpoint[Request]
A root Endpoint that always matches and extracts the current request.
- object Error extends Serializable
- object Image
-
object
Input extends Serializable
Creates an input for Endpoint from Request.
- object Output
- object Text
- object ToResponse extends HighPriorityToResponseInstances
- object ToService
- object Trace
-
object
ValidationRule
Allows the creation of reusable validation rules for Endpoints.
- object items
This is the API documentation for finch
Finch is a thin layer of purely functional basic blocks atop of [Finagle][finagle] for building composable HTTP APIs. Its mission is to provide the developers simple and robust HTTP primitives being as close as possible to the bare metal Finagle API.
Finch uses multi-project structure and contains of the following _modules_:
Please refer to the documentation for a more detailed introduction to the library.