| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Servant.Server.Internal
Contents
- data ReqBodyState
- = Uncalled
- | Called !ByteString
- | Done !ByteString
- toApplication :: RoutingApplication -> Application
- data RouteMismatch
- newtype RouteResult a = RR {}
- failWith :: RouteMismatch -> RouteResult a
- succeedWith :: a -> RouteResult a
- isMismatch :: RouteResult a -> Bool
- pathIsEmpty :: Request -> Bool
- type RoutingApplication = Request -> (RouteResult Response -> IO ResponseReceived) -> IO ResponseReceived
- splitMatrixParameters :: Text -> (Text, Text)
- parsePathInfo :: Request -> [Text]
- processedPathInfo :: Request -> [Text]
- class HasServer layout where
- captured :: FromText a => proxy (Capture sym a) -> Text -> Maybe a
- parseMatrixText :: ByteString -> QueryText
Documentation
data ReqBodyState Source #
Constructors
| Uncalled | |
| Called !ByteString | |
| Done !ByteString |
Route mismatch
data RouteMismatch Source #
Constructors
| NotFound | the usual "not found" error |
| WrongMethod | a more informative "you just got the HTTP method wrong" error |
| InvalidBody String | an even more informative "your json request body wasn't valid" error |
failWith :: RouteMismatch -> RouteResult a Source #
succeedWith :: a -> RouteResult a Source #
isMismatch :: RouteResult a -> Bool Source #
pathIsEmpty :: Request -> Bool Source #
Like `null . pathInfo`, but works with redundant trailing slashes.
type RoutingApplication Source #
Arguments
| = Request | the request, the field |
| -> (RouteResult Response -> IO ResponseReceived) | |
| -> IO ResponseReceived |
parsePathInfo :: Request -> [Text] Source #
processedPathInfo :: Request -> [Text] Source #
Returns a processed pathInfo from the request.
In order to handle matrix parameters in the request correctly, the raw pathInfo needs to be processed, so routing works as intended. Therefor this function should be used to access the pathInfo for routing purposes.
class HasServer layout where Source #
Minimal complete definition
Instances
| HasServer * Delete Source # | If you have a The code of the handler will, just like
for |
| HasServer * Raw Source # | Just pass the request to the underlying application and serve its response. Example: type MyApi = "images" :> Raw server :: Server MyApi server = serveDirectory "/var/www/images" |
| ToJSON result => HasServer * (Get result) Source # | When implementing the handler for a If successfully returning a value, we just require that its type has
a |
| ToJSON a => HasServer * (Post a) Source # | When implementing the handler for a If successfully returning a value, we just require that its type has
a |
| ToJSON a => HasServer * (Put a) Source # | When implementing the handler for a If successfully returning a value, we just require that its type has
a |
| (HasServer * a, HasServer * b) => HasServer * ((:<|>) a b) Source # | A server for type MyApi = "books" :> Get [Book] -- GET /books
:<|> "books" :> ReqBody Book :> Post Book -- POST /books
server :: Server MyApi
server = listAllBooks :<|> postBook
where listAllBooks = ...
postBook book = ... |
| (KnownSymbol capture, FromText a, HasServer * sublayout) => HasServer * ((:>) * (Capture Symbol * capture a) sublayout) Source # | If you use You can control how it'll be converted from Example: type MyApi = "books" :> Capture "isbn" Text :> Get Book
server :: Server MyApi
server = getBook
where getBook :: Text -> EitherT (Int, String) IO Book
getBook isbn = ... |
| (KnownSymbol sym, FromText a, HasServer * sublayout) => HasServer * ((:>) * (Header Symbol * sym a) sublayout) Source # | If you use All it asks is for a Example: newtype Referer = Referer Text
deriving (Eq, Show, FromText, ToText)
-- GET /view-my-referer
type MyApi = "view-my-referer" :> Header "Referer" Referer :> Get Referer
server :: Server MyApi
server = viewReferer
where viewReferer :: Referer -> EitherT (Int, String) IO referer
viewReferer referer = return referer |
| (KnownSymbol sym, FromText a, HasServer * sublayout) => HasServer * ((:>) * (QueryParam Symbol * sym a) sublayout) Source # | If you use This lets servant worry about looking it up in the query string
and turning it into a value of the type you specify, enclosed
in You can control how it'll be converted from Example: type MyApi = "books" :> QueryParam "author" Text :> Get [Book]
server :: Server MyApi
server = getBooksBy
where getBooksBy :: Maybe Text -> EitherT (Int, String) IO [Book]
getBooksBy Nothing = ...return all books...
getBooksBy (Just author) = ...return books by the given author... |
| (KnownSymbol sym, FromText a, HasServer * sublayout) => HasServer * ((:>) * (QueryParams Symbol * sym a) sublayout) Source # | If you use This lets servant worry about looking up 0 or more values in the query string
associated to You can control how the individual values are converted from Example: type MyApi = "books" :> QueryParams "authors" Text :> Get [Book]
server :: Server MyApi
server = getBooksBy
where getBooksBy :: [Text] -> EitherT (Int, String) IO [Book]
getBooksBy authors = ...return all books by these authors... |
| (KnownSymbol sym, HasServer * sublayout) => HasServer * ((:>) * (QueryFlag Symbol sym) sublayout) Source # | If you use Example: type MyApi = "books" :> QueryFlag "published" :> Get [Book]
server :: Server MyApi
server = getBooks
where getBooks :: Bool -> EitherT (Int, String) IO [Book]
getBooks onlyPublished = ...return all books, or only the ones that are already published, depending on the argument... |
| (FromJSON a, HasServer * sublayout) => HasServer * ((:>) * (ReqBody * a) sublayout) Source # | If you use All it asks is for a Example: type MyApi = "books" :> ReqBody Book :> Post Book
server :: Server MyApi
server = postBook
where postBook :: Book -> EitherT (Int, String) IO Book
postBook book = ...insert into your db... |
| (KnownSymbol sym, FromText a, HasServer * sublayout) => HasServer * ((:>) * (MatrixParam Symbol * sym a) sublayout) Source # | If you use This lets servant worry about looking it up in the query string
and turning it into a value of the type you specify, enclosed
in You can control how it'll be converted from Example: type MyApi = "books" :> MatrixParam "author" Text :> Get [Book]
server :: Server MyApi
server = getBooksBy
where getBooksBy :: Maybe Text -> EitherT (Int, String) IO [Book]
getBooksBy Nothing = ...return all books...
getBooksBy (Just author) = ...return books by the given author... |
| (KnownSymbol sym, FromText a, HasServer * sublayout) => HasServer * ((:>) * (MatrixParams Symbol * sym a) sublayout) Source # | If you use This lets servant worry about looking up 0 or more values in the query string
associated to You can control how the individual values are converted from Example: type MyApi = "books" :> MatrixParams "authors" Text :> Get [Book]
server :: Server MyApi
server = getBooksBy
where getBooksBy :: [Text] -> EitherT (Int, String) IO [Book]
getBooksBy authors = ...return all books by these authors... |
| (KnownSymbol sym, HasServer * sublayout) => HasServer * ((:>) * (MatrixFlag Symbol sym) sublayout) Source # | If you use Example: type MyApi = "books" :> MatrixFlag "published" :> Get [Book]
server :: Server MyApi
server = getBooks
where getBooks :: Bool -> EitherT (Int, String) IO [Book]
getBooks onlyPublished = ...return all books, or only the ones that are already published, depending on the argument... |
| (KnownSymbol path, HasServer * sublayout) => HasServer * ((:>) Symbol path sublayout) Source # | Make sure the incoming request starts with |