| 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
- type RoutingApplication = Request -> (RouteResult Response -> IO ResponseReceived) -> IO ResponseReceived
- class HasServer layout where
- type Server layout :: *
- route :: Proxy layout -> Server layout -> RoutingApplication
- captured :: FromText a => proxy (Capture sym a) -> Text -> Maybe a
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 | an even more informative "your json request body wasn't valid" error |
Instances
| Eq RouteMismatch | |
| Show RouteMismatch | |
| Monoid RouteMismatch | > mempty = NotFound > > NotFound |
newtype RouteResult a Source
A wrapper around .Either RouteMismatch a
Constructors
| RR | |
Fields | |
Instances
| Eq a => Eq (RouteResult a) | |
| Show a => Show (RouteResult a) | |
| Monoid (RouteResult a) | If we get a This in particular means that if we could get several |
failWith :: RouteMismatch -> RouteResult a Source
succeedWith :: a -> RouteResult a Source
isMismatch :: RouteResult a -> Bool Source
type RoutingApplication Source
Arguments
| = Request | the request, the field |
| -> (RouteResult Response -> IO ResponseReceived) | |
| -> IO ResponseReceived |
class HasServer layout where Source
Methods
route :: Proxy layout -> Server layout -> RoutingApplication Source
Instances
| HasServer * Delete | If you have a The code of the handler will, just like
for |
| HasServer * Raw | 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) | When implementing the handler for a If successfully returning a value, we just require that its type has
a |
| ToJSON a => HasServer * (Post a) | When implementing the handler for a If successfully returning a value, we just require that its type has
a |
| ToJSON a => HasServer * (Put a) | 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) | 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) | 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) | 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) | 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) | 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) | 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) | 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 path, HasServer * sublayout) => HasServer * ((:>) Symbol path sublayout) | Make sure the incoming request starts with |